如何构建共享库并在其他ndk程序中调用它

时间:2013-07-18 04:48:04

标签: android android-ndk java-native-interface

我想构建一个共享库。要构建它,我需要调用另一个共享库。这是我做的:

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.soadd.h复制到jni文件夹,创建Android.mkApplication.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项目,但得到了错误:

  

未定义引用'add(int,int)';

我认为无法找到libadd.so,但我不知道如何修改。有谁知道我怎么解决这个问题?任何帮助将不胜感激。

2 个答案:

答案 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