Android jni动态加载so
程序员文章站
2022-03-08 15:53:17
说到动态加载so,优势就在于可以便捷的进行so的更新。下面说明下。首先由于动态加载所以不能拷贝到外存储设备,所以最终是拷贝到**/data/data/PackageName/files**下面:(so是从assets文件下拷贝到/data/data/…)拷贝代码是: public static void copyData(Context context, String fileName) { InputStream in = null; FileOutputStr...
说到动态加载so,优势就在于可以便捷的进行so的更新。下面说明下。
首先由于动态加载所以不能拷贝到外存储设备,所以最终是拷贝到**/data/data/PackageName/files**下面:(so是从assets文件下拷贝到/data/data/…)
拷贝代码是:
public static void copyData(Context context, String fileName) {
InputStream in = null;
FileOutputStream out = null;
String path = context.getApplicationContext().getFilesDir().getAbsolutePath() + "/"+ fileName; // data/data目录
File file = new File(path);
if (!file.exists()) {
try {
in = context.getAssets().open(fileName); // 从assets目录下复制
out = new FileOutputStream(file);
int length = -1;
byte[] buf = new byte[1024];
while ((length = in.read(buf)) != -1) {
out.write(buf, 0, length);
}
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
}
再然后就是如何在cpp动态加载这个so,头文件**#include<dlfcn.h>**
static void *_handle = NULL;
// 创建dlopen句柄
_handle = dlopen("/data/data/$PackageName/files/$SoName", RTLD_LAZY|RTLD_GLOBAL);
//释放,关闭
if (_handle){
dlclose(_handle);
_handle= NULL;
}
如何使用so里面的函数呢。
假设so里面有个接口为:
int test(int a, int b);
调用方式就是这样:
//_test == T类型
typedef int (*_test)(int a, int b);
_test T_func = NULL;
// 反射加载到方法
T_func = (_version)dlsym(_handle, "test");
// 调用函数
int result = T_func(1,2);
到此就结束了。如果对你有用请点个赞呗。
本文地址:https://blog.csdn.net/qq_21370465/article/details/110669852
上一篇: Android Sqlite数据库详解
下一篇: Number类型计算
推荐阅读
-
Android 动态加载二维码视图生成快照的示例
-
Android将Glide动态加载不同大小的图片切圆角与圆形的方法
-
Android Studio中导入JNI生成的.so库的实现方法
-
android动态加载布局文件示例
-
android studio怎么添加.so文件?android studio加载so文件的方法
-
Android自定义view利用Xfermode实现动态文字加载动画
-
Android开发实现的ViewPager引导页功能(动态加载指示器)详解
-
Android动态库的加载system.loadlibary(三)
-
Android 的 so 文件加载机制
-
浅谈Android Studio JNI生成so库