2013-07-18 29 views
10

Tôi muốn xây dựng một thư viện được chia sẻ. Để xây dựng nó, tôi cần phải gọi một thư viện được chia sẻ khác. Đây là những gì tôi đã làm:Làm thế nào để xây dựng một thư viện được chia sẻ và gọi nó trong chương trình ndk khác

1.Tạo một dự án Android có tên "BuildLib" và thêm thư mục mới "jni" vào thư mục dự án. Nội dung của thư mục 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) 

Sau khi xây dựng dự án, Tôi đã nhận libadd.so theo thư mục $(BUILDLIB)/libs/armeabi/.

Tạo một dự án Android khác có tên "CallLib". Sao chép libadd.soadd.h vào thư mục jni, tạo 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);} 

Sau khi tất cả ở trên, tôi xây dựng dự án CallLib, nhưng đã nhận lỗi:

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

Tôi nghĩ các libadd.so không thể được tìm thấy, nhưng tôi không biết làm thế nào để sửa đổi. Có ai biết làm thế nào tôi có thể sửa lỗi này? Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Bạn đang sử dụng Eclipse để biên dịch đúng ??? Tôi thực sự bị mắc kẹt với điều này trong Android Studio. Nếu bạn có ý tưởng về cách thực hiện việc này trong Android Studio, hãy cho tôi biết. –

+0

liên quan: https://stackoverflow.com/questions/8358210/how-to-create-a-shared-library-in-android –

Trả lời

4

Trong giây Android.mk của bạn, hãy thử thay thế các mô-đun đầu tiên với:

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) 

Cờ LOCAL_EXPORT_C_INCLUDES nên đính kèm các thông tin tiêu đề cho các mô-đun add_prebuilt, vì vậy nó có thể được liên kết với thư viện cuối cùng của bạn.

+0

Cảm ơn bạn đã trả lời! Tôi quá bất cẩn, Nó phải là "PREBUILT_SHARED_LIBRARY" không phải là "PREBUILD_SHARED_LIBRARY". Quá trình trên hoàn toàn đúng, ngoại trừ lỗi này. – user2591946

1

Chỉ trong trường hợp bất cứ ai cần nó:

Một chút cách hackish để giữ mối liên kết hạnh phúc:

LOCAL_LDLIBS := -llog 

hoặc

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

Ít 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 
Các vấn đề liên quan