在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 项目,现已更新使用Kotlin+RxJava2+Retrofit2+MVP架构+组件化和
Kotlin+Retrofit2+协程+MVVM架构+组件化, 添加自动管理token 功能,添加RxJava2 生命周期管理,集成极光推送、阿里云Oss对象存储和高德地图定位功能。
项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2
来源地址:https://blog.csdn.net/NakajimaFN/article/details/130996742