NDK开发学习笔记(1):JNI开发步骤及遇到的问题详解

来源:互联网 发布:linux下移动文件夹命令 编辑:程序博客网 时间:2024/05/18 03:05

JNI 开发
步骤:
1.在Java文件类中编写native 方法
2.通过javah 命令,生成.h 头文件文件 (生成的头文件名称规则:Java_类的全名_方法名) 或者自己手写头文件
3.复制上一步生成的 .h 头文件到c 工程(提示缺少jni.h文件和jni_md.h文件),不要直接在工程中粘贴,而是要复制到工程的目录中,然后在右键点击头文件,选择添加现有项,把刚才复制的.h文件添加到工程。
4.复制jni.h 和jni_md.h到c工程
jni.h文件路径:jdk安装路径\jdk1.8.0_65\include,
jni_md.h文件路径:jdk安装路径\include/win32文件夹下。

5.新建c文件,实现.h 头文件中的声明函数(注:通过javah生成的头文件方法参数是没有名称的,即只有参数类型,没有参数名称,如:JNIEXPORT jstring JNICALL Java_com_test_JniMain_getStringFromC
(JNIEnv *, jclass);,在实现方法的时候,需要自己给参数命名)
6.生成一个dll 动态库。vc里有工具可以自动生成,步骤如图:

  • (1)选择生成解决方案的平台。

这里写图片描述

  • (2)配置生成的动态库的类型,这里生成.dll的库。
    这里写图片描述
  • (3)生成动态库,即生成一个解决方案。
    这里写图片描述
    如果在生成动态库的过程中报错“无法打开预编译头文件”,如:
    这里写图片描述
    则配置预编译头为“不使用预编译头”。如图:
    这里写图片描述
  • (4)重复第三步“生成动态库”,即可成功,如图:
    这里写图片描述

7.在java中加载动态库
把在第六步中生成的.dll动态库,复制到java或者android工程中,并引用。如:放在src或者包名目录下
这里写图片描述
或者放在工程目录下(推荐):
这里写图片描述
每次把生成的动态库复制到java工程中比较麻烦,我们还可以配置一下系统环境变量:把生成的动态库所在的路径添加到系统环境变量path中,如图:
这里写图片描述
这样我们就不用把动态库复制到java工程中,也可以直接调用了,比较省事。
8.触发native函数。
在java中调用,如:
这里写图片描述

注意:
问题1:在第二步通过javah命令生成头文件的时候,遇到一个错误,即找不到指定的类文件。
解决方法:

  • (1)把目录切换到src目录下。

  • (2)javah 包名.类名,如:javah com.example.JniTest。

只需上面两步,就可以生成.h头文件了。ps:直接把目录切换到类所在的目录下,在javah 类名,这样是不行的,还是会找不到类文件,必须是在src目录下执行:javah 包名.类名命令才可以。
问题2:在第四步的时候,如果直接把jni.h文件和jni_md.h文件复制到c工程还是报错的话,可以把这两个文件复制到vc的include目录下,(如果是把文件复制到了vc的include目录下了,则可以不用再添加到c工程中),重启工程就好了。
vc的路径:vc的安装路径\VC\include