問題:
昨天調試一個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 <--");
- }