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)的更多相关文章

  1. ant 打批量渠道包,第三方项目作为library打包出错的问题

    ant批量打包不解释了.详情请看前面其它的blog! 这里说一下 开发中,非常可能遇到引用第三方的项目作为library情况.这样的情况下该怎么打包呢? 第一:改动build.xml 第二:在init ...

  2. c/c++ 直接使用动态库 dlopen

    c/c++ 直接使用动态库 dlopen 把各个版本编译成动态库,××.so ,提供统一的接口进行调用.这里使用的工具是dlxx系列函数 dlopen  void *dlopen(const char ...

  3. SpringBoot + Layui + JustAuth +Mybatis-plus实现可第三方登录的简单后台管理系统

    1. 简介   在之前博客:SpringBoot基于JustAuth实现第三方授权登录 和 SpringBoot + Layui +Mybatis-plus实现简单后台管理系统(内置安全过滤器)上改造 ...

  4. SpringBoot基于JustAuth实现第三方授权登录

    1. 简介   随着科技时代日渐繁荣,越来越多的应用融入我们的生活.不同的应用系统不同的用户密码,造成了极差的用户体验.要是能使用常见的应用账号实现全应用的认证登录,将会更加促进应用产品的推广,为生活 ...

  5. Linux/Unix System Level Attack、Privilege Escalation(undone)

    目录 . How To Start A System Level Attack . Remote Access Attack . Local Access Attack . After Get Roo ...

  6. (使用通过混淆+自己第三方保留成功混淆)AndroidStudio 混淆打包

    原文:https://blog.csdn.net/mazhidong/article/details/64820838 AndroidStudio中的项目可以用compile的形式引入github上的 ...

  7. 采用dlopen、dlsym、dlclose加载动态链接库

    1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统 ...

  8. 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 ...

  9. springboot 关于第三方包 打包问题

    第三方包: 添加library 依赖 在pom.xml中配置 <resources> <resource> <directory>lib</directory ...

随机推荐

  1. 180713-Spring之借助Redis设计访问计数器之扩展篇

    之前写了一篇博文,简单的介绍了下如何利用Redis配合Spring搭建一个web的访问计数器,之前的内容比较初级,现在考虑对其进行扩展,新增访问者记录 记录当前站点的总访问人数(根据Ip或则设备号) ...

  2. Resharp使用简记

    一图流: 拾贝: .字符串引号中直接回车键自动添加连接字符串 Ctrl+B:转到定义 Ctr+F11:展示类结构 Ctr+Alt+j:包围代码块 Ctr+\:注释和取消注释 Alt+Ins:重构 Ct ...

  3. C 计算员工工资

    #include <stdio.h> int main(int argc, char **argv) { //定义四个变量 g每小时固定的工资 40 固定工作时间 pay工资 hours员 ...

  4. spring入门(Ioc的理解)

    spring对依赖的注入理解可以参考这篇:https://www.cnblogs.com/alltime/p/6729295.html 依赖注入和控制反转 传统的JavaEE程序中,直接在内部new一 ...

  5. token接口的测法

    接口一般都有权限的校验,一般是需要登录后才可以调用 对于接口的认证,一般通过两种方式来实现1.校验用户请求中是否包含某项指定的cookie2.校验用户的请求的header中是否包含某项指定的字段(to ...

  6. Java并发简介

    年轻的时候学会了“使用”Servlet后,感觉自己什么都会做了,之后就不停的写所谓的业务逻辑,框架(这里说的不是structs,spring等,就是说servlet)给人们屏蔽了很多复杂性(更别说构建 ...

  7. Linux系统inotify工具安装配置

    inotify主要功能 Inotify 是一个 Linux特性,它监控文件系统操作,比如读取.写入和创建.Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多.学习如何将 ...

  8. maven 教程二 深入

    一:编写POM <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  9. C++计算器项目的初始部分(第三次作业)

    C++计算器项目的初始部分 项目源文件地址:calculator 项目信息: * 项目名称:Calculator * 项目实现: * 对四则运算表达式进行拆解 * 对拆解的表达式进行简单的错误判断 * ...

  10. MongoDb Driver For Net

    由于mongodb开源github提供的net驱动都比较新,从2.3及以上版本都是netcore系列了,netframework至少都是4.6以上,且提供的dll并没有签名, 这就产生了一些问题 1 ...