在 C Level 用 dlopen 使用 第三方的 Shared Library (.so)
http://falldog7.blogspot.com/2013/10/android-c-level-dlopen-shared-library-so.html
在 Android 裡,撰寫 JNI C Level 的 code ,不管是想要 load 自己寫的獨立 shared library module (.so),或是想要把第三方的 shared library 拿來用,都必須要多做一些步驟才能達成。
1. 寫個簡單的 libtest.so
test.h
extern "C"
{
int Add(int num);
}
test.cpp
int Add(int num)
{
return num+1;
}
Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE := littest
LOCAL_SRC_FILES := test.cpp
include $(BUILD_SHARED_LIBRARY)
2. 將已經 compile 好的 libtest.so 放進新的 project 裡
首先,要先把已經 build 好的 shared library 放到 Android 專案目錄裡
而且必須根據平台區分才行:好比 armeabi, armeabi-v7a, x86, mips ,放好各平台 compile 好的 shared library 後,在 Android.mk 裡必須加一段指令,NDK 才會將這個 shared library 包進 .apk 裡
比如,我想要使用 libtest.so ,將各平台 compile 好的 .so 檔放至 mylib 底下
- mylib (folder示意)
- armeabi
- libtest.so
- aremabi-v7a
- libtest.so
- x86
- libtest.so
- mips
- libtest.so
就可以利用 NDK 的變數 $(TARGET_ARCH_ABI) 來區分不同平台的目錄
Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_SRC_FILES := ./mylib/$(TARGET_ARCH_ABI)/libtest.so
include $(PREBUILT_SHARED_LIBRARY)
Build完後,確認一下 Android 專案下的目錄 $PROJECT\lib\<abi>\,照理來說應該會找到 libtest.so
3. 使用 dlopen 控制 libtest.so
typedef int (*fnAdd)(int);
void* hDll = dlopen("/data/data/<package-name>/lib/libtest.so");
if(hDll) {
fnAdd add = (fnAdd) dlsym(hDll, "Add");
if(fnAdd){
printf("10+1=%d\n", fnAdd(10));
}
}
透過 Eclipse 將 .apk 安裝到手機上後,.so 將會放在 /data/data/<package_name>/libtest.so,這個 package_name 是定義在 AndroidManifest.xml 裡面的。
在 C Level 用 dlopen 使用 第三方的 Shared Library (.so)的更多相关文章
- ant 打批量渠道包,第三方项目作为library打包出错的问题
ant批量打包不解释了.详情请看前面其它的blog! 这里说一下 开发中,非常可能遇到引用第三方的项目作为library情况.这样的情况下该怎么打包呢? 第一:改动build.xml 第二:在init ...
- c/c++ 直接使用动态库 dlopen
c/c++ 直接使用动态库 dlopen 把各个版本编译成动态库,××.so ,提供统一的接口进行调用.这里使用的工具是dlxx系列函数 dlopen void *dlopen(const char ...
- SpringBoot + Layui + JustAuth +Mybatis-plus实现可第三方登录的简单后台管理系统
1. 简介 在之前博客:SpringBoot基于JustAuth实现第三方授权登录 和 SpringBoot + Layui +Mybatis-plus实现简单后台管理系统(内置安全过滤器)上改造 ...
- SpringBoot基于JustAuth实现第三方授权登录
1. 简介 随着科技时代日渐繁荣,越来越多的应用融入我们的生活.不同的应用系统不同的用户密码,造成了极差的用户体验.要是能使用常见的应用账号实现全应用的认证登录,将会更加促进应用产品的推广,为生活 ...
- Linux/Unix System Level Attack、Privilege Escalation(undone)
目录 . How To Start A System Level Attack . Remote Access Attack . Local Access Attack . After Get Roo ...
- (使用通过混淆+自己第三方保留成功混淆)AndroidStudio 混淆打包
原文:https://blog.csdn.net/mazhidong/article/details/64820838 AndroidStudio中的项目可以用compile的形式引入github上的 ...
- 采用dlopen、dlsym、dlclose加载动态链接库
1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统 ...
- Optimizing subroutine calls based on architecture level of called subroutine
A technique is provided for generating stubs. A processing circuit receives a call to a called funct ...
- springboot 关于第三方包 打包问题
第三方包: 添加library 依赖 在pom.xml中配置 <resources> <resource> <directory>lib</directory ...
随机推荐
- Linux命令应用大词典-第32章 性能监控
32.1 sar:收集.报告或保存系统活动信息 32.2 iostat:报告CPU统计数据和设备.分区输入.输出消息 32.3 iotop:进行I/O监控 32.4 mpstat:报告CPU相关的统计 ...
- List和String数组相互转化
在工作中经常会遇到需要String[] 参数的地方,我们可以先定义一个list,再转成String[] 来使用,使用list的好处自然是可以随时方便的添加删除元素,下面是方法: List list = ...
- matlab画图:设置y轴位置,使y轴在x轴的中间
sigmoid函数图像 x=-10:0.1:10; y=sigmf(x,[1 0]); plot(x,y) 画出的图像如下所示: 怎么将Y轴放在中间呢,而不是在左边? 即如何得到这种效果呢? 方法 ...
- CSP201403-2:窗口
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...
- CSP201312-2:ISBN号码
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...
- JDK源码分析:Short.java
Short是基本数据类型short的包装类. 1)声明部: public final class Short extends Number implements Comparable<Short ...
- leetcode个人题解——#24 Swap Nodes in Pairs
因为不太熟悉链表操作,所以解决方法烦了点,空间时间多有冗余. 代码中l,r分别是每一组的需要交换的左右指针,temp是下一组的头指针,用于交换后链接:res是交换后的l指针,用于本组交换后尾指针在下一 ...
- Python3 循环表达式
一 While循环 基本循环 while 条件: 执行内容 #循环体 ... #循环体 ... #循环体 # 若条件为真,执行循环体内容 # 若条件为假,不执行循环体内容 实例1(Python 3.0 ...
- java安装环境变量设置
1,依次打开:我的电脑-->属性-->高级-->环境变量 2,设置用户变量 新建 JAVA_HOME C:\Program Files\Java\j2sdk1.5.0 (JDK的安装 ...
- C语言 结构体相关 函数 指针 数组
. 作者 : 万境绝尘 转载请注明出处 : http://www.hanshuliang.com/?post=30 . 结构体概述 : 结构体是 多个 变量的集合, 变量的类型可以不同; -- 可进行 ...