跑一个jni 的最简单的Demo
需要提前准备 VsCode 编译器、win10下,vscode中集成linux操作系统、c++编译器(gcc、g++),java编译器(jdk1.8+)
参考:https://mangocool.com/1653030123842.html
JniDemo类:
public class JniDemo {
public static void main(String[] args) {
System.out.println("hello, this is java!");
new JniDemo().hello();
}
public native void hello();
static {
System.loadLibrary("cpp_lib_demo");
}
}
通过jdk自带javah命令生成c++的头文件
javah -classpath D:\JniDemo所在路径 com.mangocool.jni.JniDemo
或者使用javac命令(此Demo使用此命令),总之生成一个后缀为.h的头文件
javac -encoding utf8 -h . JniDemo.java
如果头文件报错,将 jni.h 和 jni_md.h 两个头文件准备好,移到同一目录下
jni.h 和 jni_md.h 所在目录一般为:/opt/jdk1.8.0_201/include/
也可以使用linux命令,如:
cp /opt/jdk1.8.0_201/include/jni.h ~/当前的项目目录/jni_demo/
根据头文件实现c++代码cppDemo.cpp:
注意:一定要在包名前加上:Java_,没有包名 直接Java_JniDemo_hello,_hello是因为java文件中的:new JniDemo().hello();
#include "生成头文件.h" // Import generated header file.
#include "jni.h"
JNIEXPORT void JNICALL Java_包名_没有不加_JniDemo_hello
(JNIEnv * env, jobject jb){
printf("%s","hello, this is cpp!");
}
创建Makefile文件:
注:记得修改/opt/jdk1.8.0_201/成你的java路径
libcpp_lib_demo.so : cppDemo.cpp
g++ -o $@ $+ -fPIC -shared -I /opt/jdk1.8.0_201/include -I /opt/jdk1.8.0_201/include/linux
.PHONY : clean
clean :
rm libcpp_lib_demo.so
这一步主要为了将c++代码生成 libcpp_lib_demo.so 文件,如果最后执行不成功也可以使用命令生成:
g++ -fpic -shared -o libcpp_lib_demo.so cppDemo.cpp
创建一个目录,如:jni_demo,将JniDemo.class、cppDemo.cpp、com_mangocool_jni_JniDemo.h、Makefile复制到该目录下下进行编译以及测试:
执行 make ---生成libcpp_lib_demo.so文件
如果执行不成功,未能生成libcpp_lib_demo.so
也可以执行:g++ -fpic -shared -o libcpp_lib_demo.so cppDemo.cpp
最后生成的所有文件:
最后运行java:
注:记得修改/opt/jdk1.8.0_201/成你的java路径
尽量不适用:java JniDemo // 这个方法不行
/opt/jdk1.8.0_201/bin/java -Djava.library.path='.' JniDemo
最后就可以看到结果啦:---本程序测试已运行成功
分别输出:
hello, this is java!
hello, this is cpp!