在日常的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 Generator
Program
为Tools
执行的命令的路径,如果你需要替换为你自己JDK中的javap
修改这个值就行,此处使用Android Studio
自带的JDK
路径,填入$JDKPath$/bin/javap
Parameters
为命令执行的参数,我们要获取方法描述符,所以设置为:-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中的方法咯。