Android 项目调用第三方库so动态库

在Android NDK开发中,可以通过自己编写C/C++代码来构建so动态库进行调用之外,还可以把so动态库提供给第三方使用;接下来,我将介绍在新创建的Android 项目(或已存在的Android 项目)中如何调用第三方so动态库。

关于如何进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库,请查看Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库_ErwinNakajima的博客-CSDN博客

注意:编译生成so动态库的Android 项目要与新创建的Android 项目(或已存在的Android项目)的包名保持一致,不然会调用失败。

1.首先使用Android Studio(使用Android Studio 4.2.2之后的稳定版本)创建一个Android 项目(或打开已存在的Android 项目),项目包名要与编译生成so动态库的Android 项目保持一致,需要在app下的build.gradle文件中的android下添加

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
然后在android下的defaultConfig下添加
ndk {
            //选择要添加的对应 cpu 类型的 .so 库。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
//            abiFilters 'armeabi-v7a', 'arm64-v8a'
            // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }

最后把第三方so文件复制到libs目录下(如下图一),我这里有三种so文件,分别是armeabi、armeabi-v7a、arm64-v8a(具体根据提供方来,一般有armeabi-v7a、arm64-v8a这两种就可以了)。

2.Android Studio 配置NDK(使用Android Studio 4.2.2之后的稳定版本)

(1) 步骤一:点击红圈处(这是Mac配置流程,Windows对应的按钮是Settings)

(2)步骤二:下载下图一中第3步红圈中的一个NDK和一个CMake,下载成功后如下图一所示(建议下载前先配置Android Studio 国内镜像代理,详见:Android Studio 国内镜像代理设置(如果设置之后还是远程仓库下载失败,请仔细阅读其内容就可以解决了)_android studio 镜像_ErwinNakajima的博客-CSDN博客)。

3.在项目中的创建JavaGetData文件,文件内容

package com.phone.library_common;

import android.content.Context;

public class JavaGetData {
    static {
        System.loadLibrary("return-data");
        System.loadLibrary("native-lib");
    }

    public static native String nativeAesKey(Context context, boolean isRelease);

    public static native String nativeDatabaseEncryptKey(Context context, boolean isRelease);

    public static native String nativeGetString(Context context, boolean isRelease);


}

我这里把System.loadLibrary调用直接写在了JavaGetData类的代码块,就不用单独写一个static方法进行调用了。

注意:两个System.loadLibrary方法的参数不是libnative-lib.so和native-lib.so,而是

libnative-lib和native-lib(记得要把so文件名的.so去掉,然后再作为参数传入System.loadLibrary方法)。

4.在用到的地方进行调用native方法即可

val aesKey =
            JavaGetData.nativeAesKey(this@MainActivity, false)
        val databaseEncryptKey =
            JavaGetData.nativeDatabaseEncryptKey(this@MainActivity, false)
        val getString =
            JavaGetData.nativeGetString(this@MainActivity, false)
        LogManager.i(TAG, "aesKey*****$aesKey")
        LogManager.i(TAG, "databaseEncryptKey*****$databaseEncryptKey")
        LogManager.i(TAG, "getString*****$getString")

如对此有疑问,请联系qq1164688204。

推荐Android开源项目

项目功能介绍:RxJava2和Retrofit2项目,添加自动管理token功能,添加RxJava2生命周期管理,使用App架构设计是MVP模式和MVVM模式,同时使用组件化,部分代码使用Kotlin,此项目持续维护中。

项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2

猜你喜欢

转载自blog.csdn.net/NakajimaFN/article/details/130996742
今日推荐