先把so文件放到APP的libs目录下:
在build.gradle下添加,和defaultConfig、buildTypes同级:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
在dependencies中添加:
implementation fileTree(include: ['*.jar'], dir: 'libs')
添加后如图:
加载so库代码:
static {
loadNativeLibrary();
}
private static synchronized void loadNativeLibrary() {
System.loadLibrary("encrypt");
}
调用的so内的方法前需要添加native关键字:
private static native byte[] e(byte[] input);
需要注意的点:一、包名要和so库中的包名一样;二、类名也要一致。 我们看看so库的头文件中的函数:
JNIEXPORT jint JNICALL Java_cn_scnu_MainActivity_num
(JNIEnv *, jobject);
函数名为Java_包名类名函数名。所以我们创建的Android工程的包名也要一致,即cn_scnu,同时,负责加载并且提供native方法的类的类名也要相同,即MainActivity,否则调用不成功,提示找不到方法。
过程中遇到两个错误:
1.is 32-bit instead of 64-bit动态库错误
2.UnsatisfiedLinkError
有价值的解决方式:
https://segmentfault.com/a/1190000006210166
https://blog.csdn.net/xiaxiayige/article/details/68925669