1:版本不一致遇到的坑
javah的版本需要同javac的版本一致。如果版本的问题搞不定,直接用andorid source build之后的环境即可
2:javah使用遇到的坑
jni中字段描述符可以使用javah生成
javah -jni -classpath . JNIdemo
其中 -classpath . 表示从当前目录搜索class 如果不添加会爆出来各种不太相关的错误
3:执行class时遇到的坑
如果执行class时候,需要调用 so
仅仅直接执行 java JNIdemo会报错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: no native in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1124)
at JNIDemo.<clinit>(JNIDemo.java:4)
这时需要 exprort lD_LIBRARY_PATH=. 等号两边不要有空格。用来配置so的寻找路径
4.java 静态map c
直接使用javah来生成.h文件。在c中inlcude 该 .h即可。
当然也可以将java.h 去掉。把inlude 的内容都放到c文件中
如果大型工程中无法单独compile,可以将需要map的函数单独拿出来创建一个java文件。
5:编译so文件的指令
gcc -I (jni.h的路径) -I(jvm.h的路径) -fPIC -shared -o libnative.so native.c
eg:
gcc -I /home/austinxin/work/SM8150-Android/android/prebuilts/jdk/jdk9/linux-x86/include -I /home/austinxin/work/SM8150-Android/android/prebuilts/jdk/jdk9/linux-x86/include/linux/ -shared -o libnative.so JNIDemo.c
eg:
gcc -I /usr/lib/jvm/java-1.11.0-openjdk-amd64/include/ -I /usr/lib/jvm/java-11-openjdk-am64/include/include/ -fPIC -shared -o libnative.so native.c
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)