Android - 动态库双向依赖解决方法

问题:
昨天调试一个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的相互关系,这种方法就会起到很好的作用了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要集成下载Android-SerialPort-API库,可以按照以下步骤进行: 1. 首先下载Android-SerialPort-API库的源代码,可以从Github上获取。 2. 将下载的源代码解压缩后,将其中的serial_port_api.c和serial_port_api.h文件复制到你的Android项目的jni目录下。 3. 在jni目录下创建一个Android.mk文件,文件内容如下: ``` LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := serial_port_api LOCAL_SRC_FILES := serial_port_api.c include $(BUILD_SHARED_LIBRARY) ``` 4. 在jni目录下创建一个Application.mk文件,文件内容如下: ``` APP_MODULES := serial_port_api APP_OPTIM := release APP_ABI := armeabi armeabi-v7a x86 ``` 5. 在AndroidManifest.xml文件中添加以下权限: ``` <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.SET_DEBUG_APP"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-feature android:name="android.hardware.usb.host"/> ``` 6. 将serial_port_api库文件导入到你的项目中,可以通过以下方式: - 将库文件打包成.jar文件,并通过Build Path->Add External Archives添加到你的项目中。 - 将库文件复制到libs目录下,并通过Build Path->Add Libraries添加到你的项目中。 7. 在你的Android代码中调用serial_port_api库的相关函数,以实现串口通信。 注意:集成Android-SerialPort-API库需要NDK支持,所以请确保你已经安装了NDK。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值