Android - 动态库双向依赖解决方法
来源:互联网 发布:k means聚类算法原理 编辑:程序博客网 时间:2024/06/03 17:14
问题:
昨天调试一个CA库link失败的问题:ca厂商一般提供的都是静态ca库,这样子你直接将其与
你的库link在一起即可使用,但由于apk在ndk中编译器:android-ndk-r6b\arm-linux-androideabi-4.4.3
而ca库使用hisi编译器:arm-eabi-4.4.0_hisi 两者使用的编译不同,所以需要在linux android环境
下将ca静态库打包成动态库,而且用户实现的ca函数将会link失败,生成的动态库将在ndk中使用。
下面是一个简单的测试例子,用于说明一下如何做到相互依赖而编译生成动态库的方法
1、首先编译生成动态库
然后实现文件:testA.c
这里最重要的是利用setInterface接口解决相互link的问题,这就是本质所在。大家一看就明白了,这也是动态
库导出函数的最好方法,一般使用QueryInterface及enumInterface即可,使用结构将
编译方法:
昨天调试一个CA库link失败的问题:ca厂商一般提供的都是静态ca库,这样子你直接将其与
你的库link在一起即可使用,但由于apk在ndk中编译器:android-ndk-r6b\arm-linux-androideabi-4.4.3
而ca库使用hisi编译器:arm-eabi-4.4.0_hisi 两者使用的编译不同,所以需要在linux android环境
下将ca静态库打包成动态库,而且用户实现的ca函数将会link失败,生成的动态库将在ndk中使用。
下面是一个简单的测试例子,用于说明一下如何做到相互依赖而编译生成动态库的方法
1、首先编译生成动态库
首先定义头文件:test.h
#ifndef XXX_TEST_H___#define XXX_TEST_H___/* 由link的库实现 */extern void testA();extern void testB();/* 由本身库实现而由外部调用 */extern void testC();extern void testD();struct AAInterface{void (*testA)();void (*testB)();};extern void setInterface(struct AAInterface *cb);#endif /* XXX_TEST_H___ */
然后实现文件:testA.c
#include <assert.h>#include <stdlib.h>#include <string.h>#include <cutils/log.h>#include "test.h"static struct AAInterface g_aa_interface ;/* 由link的库实现 */extern void testA(){g_aa_interface.testA();}extern void testB(){g_aa_interface.testB();}extern void testCall(){LOGI("testCall 111");testA();LOGI("testCall 222");testB();LOGI("testCall 333");}/* 由本身库实现而由外部调用 */extern void testC(){LOGI("testC call in--->");testCall();LOGI("testC call out<---");}extern void testD(){LOGI("testD call in--->");testCall();LOGI("testD call out<---");}extern void setInterface(struct AAInterface *cb){LOGI("setInterface call in -->");memset((void*)&g_aa_interface,0x00,sizeof(g_aa_interface));g_aa_interface.testA = cb->testA;g_aa_interface.testB = cb->testB;LOGI("setInterface call out <--");}
这里最重要的是利用setInterface接口解决相互link的问题,这就是本质所在。大家一看就明白了,这也是动态
库导出函数的最好方法,一般使用QueryInterface及enumInterface即可,使用结构将
编译方法:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:= libtestASO
LOCAL_SRC_FILES:= \
testA.c \
LOCAL_SHARED_LIBRARIES := liblog\
LOCAL_C_INCLUDES += \
$(TOP)/frameworks/base/test/testA \
LOCAL_CFLAGS += -D_cplusplus
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
2、使用生成的动态库
#include <assert.h>#include <stdlib.h>#include <string.h>#include <cutils/log.h>#include <test.h>/* 由link的库实现 */extern void testA(){LOGI("testA call ...");}extern void testB(){LOGI("testB call ...");}int main(void){struct AAInterface *itf = (struct AAInterface*)calloc(1,sizeof(struct AAInterface));itf->testA = testA;itf->testB = testB;setInterface(itf);testC();testD();return 0;}
ok,知道了如何解决这种相互依赖的方法,解决方法相当解决。。对于这种A需要link B,而B又需要link A的相互关系,这种方法就会起到很好的作用了。
- Android - 动态库双向依赖解决方法
- Android - 动态库双向依赖解决方法
- Android - 动态库双向依赖解决方法
- Android之Android studio动态搜索添加依赖库
- Android依赖库版本冲突的一个解决方法
- 多动态库依赖
- FishiGUI:双向依赖--强双向依赖和弱双向依赖
- Android 查看动态库依赖的库文件
- 动态库连接依赖问题
- android实现gradle动态依赖打包
- Android程序 依赖库引用Gson 报java.lang.NoClassDefFoundError: com/google/gson/Gson 解决方法
- Android 库依赖
- 常用android依赖库
- android最新依赖库
- 交叉编译库依赖问题的解决方法
- 交叉编译库依赖问题的解决方法
- 链接静态库循环依赖解决方法
- 交叉编译库依赖问题的解决方法
- 命令行执行jar
- ubuntu12.04开机出现waiting up to 60 more seconds for network configuration问题的解决
- iphone tag总结
- 各种排序算法的java实现及时间、空间复杂度、稳定程度总结
- shenll重定向
- Android - 动态库双向依赖解决方法
- 11044 - Searching for Nessy
- Objective-C中动态识别的方法
- php 文章分页
- Oracle 10g Client Download address
- linux shell中 2>/dev/null和/dev/null 2>&1 的解释
- 双机热备下,sql server2005 进行数据库复制
- Python/Django开发笔记(1)
- Silverlight经典应用案例整理