2013-07-18 33 views
10

我想構建一個共享庫。爲了構建它,我需要調用另一個共享庫。這是我做的:如何構建一個共享庫並在其他ndk程序中調用它

1.創建一個名爲「BuildLib」的Android項目,並在項目目錄下添加一個新文件夾「jni」。 JNI文件夾的內容:

jni-->Android.mk
-->Application.mk
-->add.cpp
-->add.h add.cpp just do two numbers addition:

add.h:

int add(int a,int b);

add.cpp:

#include "add.h" 
int add(int a,int b){ 
    return a+b;} 

Android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := add.cpp 
LOCAL_MODULE  := add 
include $(BUILD_SHARED_LIBRARY) 

建設項目後,我在目錄$(BUILDLIB)/libs/armeabi/下找到了libadd.so。

創建另一個名爲「CallLib」的Android項目。將libadd.soadd.h複製到jni文件夾,創建Android.mk,Application.mkcall_add.cpp

Android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := libadd.so 
LOCAL_MODULE := add_prebuilt 
include $(PREBUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 
LOCAL_SRC_FILES := call_add.cpp 
LOCAL_MODULE  := native 
LOCAL_SHARED_LIBRARIES := add_prebuilt 
include $(BUILD_SHARED_LIBRARY) 

call_add.cpp:

#include "add.h" 
int call_add(){return add(1,2);} 

以上所有後,我建立CallLib項目,但得到的錯誤:

undefined reference to 'add(int, int)';

我想找不到libadd.so,但我不知道如何修改。有誰知道我該如何解決這個問題?任何幫助將不勝感激。

+0

你正在使用Eclipse進行編譯嗎? 我在Android Studio中確實困惑於此。 如果您有任何關於如何在Android Studio中執行此操作的想法,請告訴我。 –

+0

相關:https://stackoverflow.com/questions/8358210/how-to-create-a-shared-library-in-android –

回答

4

在你的第二個Android.mk,嘗試更換第一模塊:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := libadd.so 
LOCAL_MODULE := add_prebuilt 
LOCAL_EXPORT_C_INCLUDES := add.h 
include $(PREBUILD_SHARED_LIBRARY) 

LOCAL_EXPORT_C_INCLUDES標誌應附有報頭信息add_prebuilt模塊,因此它可以與你的最終庫鏈接。

+0

感謝您的回覆!我太粗心了,應該是「PREBUILT_SHARED_LIBRARY」而不是「PREBUILD_SHARED_LIBRARY」。除了這個錯誤,上面的過程是絕對正確的。 – user2591946

1

萬一有人需要它:

一個有點hackish的方式來保持連接開心:

LOCAL_LDLIBS := -llog 

LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -lMyStuff 

減的hackish:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := xyz 
LOCAL_SRC_FILES += xyz/xyz.c 
LOCAL_LDLIBS := -llog 
include $(BUILD_SHARED_LIBRARY) # this builds libxyz.so 


include $(CLEAR_VARS) 
LOCAL_MODULE := abc 
LOCAL_SHARED_LIBRARIES := xyz # <=== !!! this makes libabc.so dependent on libxyz.so 
LOCAL_SRC_FILES := abc/abc.c 
#LOCAL_LDLIBS := ... 
include $(BUILD_SHARED_LIBRARY) # this builds libabc.so 
相關問題