相信大家在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后面的参数要是 包名.类名


更多相关文章

  1. Android高级工程师BAT面试题及知识点整理大全(Java基础+Android模
  2. Android(安卓)主流开源框架(七)Glide 的缓存机制
  3. Android逆向之旅---爆破应用签名的一种全新高效方式(Native+服务
  4. android onkeydown()简介
  5. Android中实现WebView和JavaScript的互相调用详解
  6. Android(安卓)程序开发的插件化 模块化方法 之一
  7. Android之完美退出方法(2.1-2.2-2.3SDK版本测试通过)
  8. Android笔记(一):Android工程目录介绍
  9. Android(安卓)WebView调用本地相册的方法

随机推荐

  1. android 的几个黄色警告解决办法
  2. 判断可用的intent和更改Drawable的透明度
  3. Unity上同时兼容Android和IOS的JSON库
  4. android 加载 网络图片
  5. Android实现“退出确认”对话框
  6. android 怎么判断手机号是移动还是联通
  7. 关于android中drawable—hdpi、drawable
  8. 检查Android进程当前是否正在后台运行
  9. 把Unity作为Android的子视图
  10. Android(安卓)中动态加载.jar的实现步骤