相信大家在Android中使用NDK开发时,免不了使用JNI。首先在java中声明native方法,而这些native方法是由c或c++来实现的。为了让java能够找到对应的本地实现方法,就需要建立一个对应关系。当然我们可以自己手工编写,但是太麻烦了,还好jdk中有javah这个工具,来帮助我们自动生成本地头文件。
我刚开始也在网上搜索了一下,按照网上的做法怎么也不成功。主要原因是很多人说的不够清楚,导致经常出现类似下面的错误:
error: cannot access com.example.soundtouchdemo.JNISoundTouch
class file for com.example.soundtouchdemo.JNISoundTouch not found
javadoc: error - Class com.example.soundtouchdemo.JNISoundTouch not found.
Error: No classes were specified on the command line. Try -help.
经过仔细研究,正确的做法是:
1. cd到你Android工程的bin/classes目录下
hejinlai_iMac:classes hejinlai$ pwd
/Users/hejinlai/Workspace/Android/SoundTouchDemo/bin/classes
这个是非常关键的,之所以错误,就是因为没有进入到这个目录下。很显然这个目录下面有一目录,这个目录就是你包名的顶级目录,一般来说都是com目录:
hejinlai_iMac:classes hejinlai$ ls -l
total 0
drwxr-xr-x 3 hejinlai staff 102 Jun 19 11:32 com
2. 然后执行 javah 包名.类名
注意包名一定要完整,用 . 隔开,后面的是类的名字,不带任何后缀。
hejinlai_iMac:classes hejinlai$ javah com.example.soundtouchdemo.JNISoundTouch
hejinlai_iMac:classes hejinlai$ ls -l
total 8
drwxr-xr-x 3 hejinlai staff 102 Jun 19 11:32 com
-rw-r--r-- 1 hejinlai staff 1918 Jun 19 14:49 com_example_soundtouchdemo_JNISoundTouch.h
hejinlai_iMac:classes hejinlai$
总结:在执行javah的时候,一定要确保在正确的目录下,javah后面的参数要是 包名.类名