接触Jni的时候,最繁琐的就是去生成
.h
头文件,以前很笨的方法就是通过javah工具生成.h头文件,还要各种指定路径等繁琐操作,写着写着就有点烦人。现在介绍一种更快捷的方式,通过配置快捷键的形式一劳永逸。
快捷配置效果预览
javah
javah
Program:$JDKPath$/bin/javah
Parameters:-encoding UTF-8 -d ../jni -jni $FileClass$
Working directory:$ModuleFileDir$/src/main/java
ndk-build
ndk-build
Program:/Users/Liam/Library/Android/sdk/ndk-bundle/build/ndk-build
Parameters:
Working directory:$ModuleFileDir$/src/main
ndk-build clean
ndk-build clean
Program:/Users/Liam/Library/Android/sdk/ndk-bundle/build/ndk-build
Parameters:clean
Working directory:$ModuleFileDir$/src/main
NDK开发常见的一些错误:
Error 1
UnsatisfiedLinkError: No implementation found for int com.liam.nativeplugin.nativeutils.SymLink.createSymLinkJNI(java.lang.String, java.lang.String)
(tried Java_com_liam_nativeplugin_nativeutils_SymLink_createSymLinkJNI and Java_com_liam_nativeplugin_nativeutils_SymLink_createSymLinkJNI__Ljava_lang_String_2Ljava_lang_String_2)
这是刚接触的时候最会遇到的错误类型了,意思就是会所,.c
文件定义的JNI接口类型是Java_com_liam_nativeplugin_nativeutils_SymLink_createSymLinkJNI
即包名必须为com.liam.nativeplugin.nativeutils
,类名为必须为SymLink
。
也就是说,我们.so中函数声明涉及到的package name和class name与调用它的package name和class name不符。因此我们要改变我们工程中的package name和class name。使其与.so文件中函数签名提示的一致,在这个类中加入native方法的声明。
知道了这个规则,那么错误解决方案自然也就懂了。修改正确的package name和class name重新编译一下就好了。