我想构建一个共享库。要构建它,我需要调用另一个共享库。这是我做的:
1.创建一个名为“BuildLib”的Android项目,并在项目目录下添加一个新文件夹“jni”。 jni文件夹的内容:
JNI - > Android.mk
- > Application.mk
- > add.cpp
- > add.h add.cpp只做两个数字加法:
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.so
和add.h
复制到jni文件夹,创建Android.mk
,Application.mk
和call_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项目,但得到了错误:
未定义引用'add(int,int)';
我认为无法找到libadd.so
,但我不知道如何修改。有谁知道我怎么解决这个问题?任何帮助将不胜感激。
答案 0 :(得分: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
模块,因此它可以与最终库链接。
答案 1 :(得分:1)
万一有人需要它:
保持链接器满意的有点hackish方式:
LOCAL_LDLIBS := -llog
或
LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -lMyStuff
不那么讨厌:
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