在Ubuntu18.04中使用JNI实现java调用C++

在Ubuntu18.04中使用JNI实现java调用C++

工具:
1.emacs
2.eclipse
3.jdk

第一步 java代码的编写

在Ubuntu18.04中使用JNI实现java调用C++在eclipse中新建一个项目JNI_test,并在该项目中新建文件demo.java,输入以上java代码。

第二步 用javah命令将java代码转换为本地接口类的头文件

在Ubuntu18.04中使用JNI实现java调用C++在Ubuntu18.04中使用JNI实现java调用C++

在eclipse中的工具栏里选择project->clean…并且保证Build Automatically项是勾选的,点击Run图标,这样在JNI_test/src中将产生一个最新的demo.java文件,该文件是java代码编译后的结果。然后从终端打开JNI_test/src,输入javah -jni demo命令即可产生本地接口类头文件demo.h.

第三步 C++代码的编写

在Ubuntu18.04中使用JNI实现java调用C++在Ubuntu18.04中使用JNI实现java调用C++在Ubuntu18.04中使用JNI实现java调用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生成动态链接库:
在Ubuntu18.04中使用JNI实现java调用C++
其中包含了两条命令:
g++ -fpic -c test_JNI.cpp add.h add.cpp
g++ -shared -o libJNI_so_test.so test_JNI.o
在Ubuntu18.04中使用JNI实现java调用C++
可以在C++项目的目录下看到动态库libJNI_so_test.so已经生成了,将其拷贝到java项目***意该动态连接库的命名必须是lib[…].so,否则无法识别。

第五步 java加载动态链接库

在Ubuntu18.04中使用JNI实现java调用C++
这里在java项目所在路径新建一个文件夹JNI_test,并将前面生成的动态链接库放在里面。然后在eclipse中对读取路径进行设置:
在Ubuntu18.04中使用JNI实现java调用C++
在JNI_test项目处右键,选择properties,然后打开以上界面。将Native library location设置为我们存放动态链接库的路径,注意存放动态链接库的文件名必须和动态链接库保持一致,然后点击apply.

第六步 编译运行程序

在Ubuntu18.04中使用JNI实现java调用C++
点击Run图标可以得到最终结果。

参考资料:
[1]java调用C++的过程
[2]linux 下编译生成静态库和动态库
[3]java调用C++代码