在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://www.toymoban.com/news/detail-586658.html
项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2文章来源地址https://www.toymoban.com/news/detail-586658.html
到了这里,关于Android 项目调用第三方库so动态库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!