在Ubuntu18.04中使用JNI实现java调用C++
在Ubuntu18.04中使用JNI实现java调用C++
工具:
1.emacs
2.eclipse
3.jdk
第一步 java代码的编写
在eclipse中新建一个项目JNI_test,并在该项目中新建文件demo.java,输入以上java代码。
第二步 用javah命令将java代码转换为本地接口类的头文件
在eclipse中的工具栏里选择project->clean…并且保证Build Automatically项是勾选的,点击Run图标,这样在JNI_test/src中将产生一个最新的demo.java文件,该文件是java代码编译后的结果。然后从终端打开JNI_test/src,输入javah -jni demo命令即可产生本地接口类头文件demo.h.
第三步 C++代码的编写
需要注意的是,如果类名是demo,在test_JNI中函数的名称必须是**[…]demo[…]**而不能是[…]Demo[…]之类的,否则会失败。
第四步 生成动态链接库
由于demo.h文件中包含了jni.h文件,而C++的文件中又要包含demo.h文件,因此jni.h必须放在一个g++编译器能够访问的地方,这里可以将/jdk1.8.0_231/include目录下的文件复制到/usr/local/include下来解决这个问题。
接着打开shell生成动态链接库:
其中包含了两条命令:
g++ -fpic -c test_JNI.cpp add.h add.cpp
g++ -shared -o libJNI_so_test.so test_JNI.o
可以在C++项目的目录下看到动态库libJNI_so_test.so已经生成了,将其拷贝到java项目***意该动态连接库的命名必须是lib[…].so,否则无法识别。
第五步 java加载动态链接库
这里在java项目所在路径新建一个文件夹JNI_test,并将前面生成的动态链接库放在里面。然后在eclipse中对读取路径进行设置:
在JNI_test项目处右键,选择properties,然后打开以上界面。将Native library location设置为我们存放动态链接库的路径,注意存放动态链接库的文件名必须和动态链接库保持一致,然后点击apply.
第六步 编译运行程序
点击Run图标可以得到最终结果。
参考资料:
[1]java调用C++的过程
[2]linux 下编译生成静态库和动态库
[3]java调用C++代码