在 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 裡面的。

时间: 2024-10-12 06:33:56

在 C Level 用 dlopen 使用 第三方的 Shared Library (.so)的相关文章

【Android笔记】Android引用第三方依赖包library报错解决方法

在Android工程项目中,我们经常需要引用第三方依赖包library,有可能遇到以下引用报错的问题: 在设置完library后重新打开显示管理错误,就是reference那里有个红叉叉,eclipse没有报错. 那么有可能是因为: 在windows系统下,你的工程项目跟要引用的library工程项目不是在同一个盘符或跟目录下. 因为如果在不同盘符,project.properties中的android.library.reference.1值变成绝对路径,而ADT推荐是在ubuntu下使用的,

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

ant批量打包不解释了,详情请看前面其他的blog! 这里说一下 开发中,很可能遇到引用第三方的项目作为library情况,这种情况下该怎么打包呢? 第一:修改build.xml 第二:在init的target中 第三步:在生成gen-R中 第四步:编译的时候,加上library的src和libs 第五步:资源文件输出打包,记得打进去 第六步:就木有了, 哦哈哈哈!!简单不简单啊!! 有问题留言吧!! 福利:"非法字符:/65279"的错误,怎么办?? 在ant编译时,有时会提示非法字

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

把各个版本编译成动态库,××.so ,提供统一的接口进行调用.这里使用的工具是dlxx系列函数 dlopen  void *dlopen(const char *filename, int flag);    装载动态库 dlclose int dlclose(void *handle); dlerror char *dlerror(void); 返回可读字符串 dladdr dlsym void *dlsym(void *handle, const char *symbol); dlvsym

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 function. The processing circuit retrieves a called function property of the called function. The processing circuit generates a stub for the called functi

第三方类库学习笔记:CustomShapeImageView 自定义形状的ImageView

一个两年前出来的第三方类库,具有不限于圆形ImageView的多种形状ImageView,项目开发必备 github下载地址:https://github.com/MostafaGazar/CustomShapeImageView 1.首先源码中有一个第三方类库 :library 先要把Library导入到项目中, 不会的可以看下导入方法:关于Eclipse 和 IDEA 导入library库文件 的步骤 2.源码中res文件夹下有一个raw文件夹 复制到自己的项目中(选择性复制,是一些特殊的图

Android一个完整的项目转成SDK提供给第三方嵌入

1.项目导出Apk反编译到res/values/目录下找到'public.xml'和'ids.xml'两个文件: 2.项目设置为libray项目: 3.项目"Clean...",如果出现switch语句错误,一般要修改成if-else: [选择switch整个语句-右键-Quick Fix-Convert 'switch' to 'if-else'] 4.拷贝上面提到的'public.xml'和'ids.xml'两个文件到项目res/values目录下,这一步是定义资源ID,防止在Li

Linux动态库相关知识整理

动态库和静态库在C/C++开发中很常见,相比静态库直接被编译到可执行程序, 动态库运行时加载使得可执行程序的体积更小,更新动态库可以不用重新编译可执 行程序等诸多好处.作者是一个Linux后台开发,这些知识经常用到,所以 整理了一下这方面的知识.静态库相对简单,本文只关心Linux平台下的动态库. 创建动态库 这里我把一个短小却很有用的哈希函数编译成动态库做为示例,ELFhash用于对字符串做哈希,返回一个无符号整数. //elfhash.h #include <stdio.h> unsign

Android NDK开发指南---Application.mk文件和android.mk文件

https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https://android.googlesource.com/platform/ndk/+/4e159d95ebf23b5f72bb707b0cb1518ef96b3d03/docs/ANDROID-MK.TXT https://android.googlesource.com/platform/ndk/+/4

Autotools Mythbuster

Preface Diego Elio?"Flameeyes"?Pettenò Author and Publisher?<[email protected]> SRC=https://autotools.io/index.html David J.?"user99"?Cozatt Miscellaneous Editing?<[email protected]> Copyright ? 2009-2013 Diego Elio Pettenò