Android studio加载so调用本地方法

先把so文件放到APP的libs目录下:

Android studio加载so调用本地方法_第1张图片

编辑app下的build.gradle文件:

在build.gradle下添加,和defaultConfig、buildTypes同级:

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

 在dependencies中添加:

implementation fileTree(include: ['*.jar'], dir: 'libs')

添加后如图:

Android studio加载so调用本地方法_第2张图片

so库调用:

Android studio加载so调用本地方法_第3张图片

加载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

 

你可能感兴趣的:(Android)