在日常的Android NDK开发中,会不可避免的用到C与Java代码相互调用的情况。Java调用C的方法还好,C调用Java的方法就比较麻烦了。需要编写看着就头疼的Java方法描述符才能正确的调用Java方法。
其中常见的Java方法域和描述符如下表所示:
| Java类型 | 签名 |
|---|---|
| Boolean | Z |
| Byte | B |
| Char | C |
| Short | S |
| Int | I |
| Long | J |
| Float | F |
| Double | D |
| Fully-qualified-class | Lfully-qualified-class |
| type[] | [type |
| Method type | (arg-type)ret-type |
通过上述对照表,我们可以通过C代码查找一个为String类型的Java静态字段,例如:
1 | jfieldID staticJavaFieldId; |
借助javap我们可以很方便的得知一个class文件其中包含对应的描述符。如下:
1 | $ javap -s -p com.xiamo.test.Message |
但是每次需要查看对应类的方法描述符的时候都需要手动敲一次命令,这样显然不够清真。好在Android Studio为我们提供了External Tools。我们可以用它来自定义这个操作简化我们的双手。
设置External Tools
打开Android Studio的设置页面,在Tools选项卡中选中External Tools,如下图所示:

点击右侧区域的+新增一个Tools,在选卡中填入如下图所示的参数:

Name为你要设置的External Tools的名字,便于你自己标识就行,此处我设置为JNI Descriptor GeneratorProgram为Tools执行的命令的路径,如果你需要替换为你自己JDK中的javap修改这个值就行,此处使用Android Studio自带的JDK路径,填入$JDKPath$/bin/javapParameters为命令执行的参数,我们要获取方法描述符,所以设置为:-s -p $FileClass$Working directory为上述设置好的工具执行的目录,设置为$ModuleFileDir$/build/intermediates/classes/debug
点击保存,我们的External Tools就设置好啦。这个时候在Tools—>External Tools中就可以看到我们设置好的Tools了。需要注意的是这个时候点击改工具查看当前我们选中的Java源文件的文件操作符,是可能会报错找不到指定的class文件。
这是因为我们指定的Working directory中还没有生成class文件,选择Build选项中的Make Project,等待make完成,再次点击Tools—>External Tools—> JNI Descriptor Generator 即可生成对应Java源文件的文件描述符了。这样我们就可以愉快的调用使用C调用Java中的方法咯。