如何在jni中链接静态库?

时间:2014-11-27 10:11:31

标签: java android android-ndk g++ static-libraries

我创建了带声明

的头文件“abc.h”
int abc();

然后,我创建了一个带有定义

的.cpp文件“abc.cpp”
int abc()
{ 
  return 0;
}

现在我从上面的文件中创建了一个静态库libabc.a。

然后我创建了一个HelloWorld Android项目。然后我在其中创建了一个jni文件夹,其中包含子文件夹“header”和“src”。在头文件夹中我放了abc.h并在src文件夹中放了“abc.cpp”。现在我在jni文件夹中创建了另一个文件“xyz.cpp”,它希望使用abc()函数。但是当我运行ndk-build命令时,我得到了这个错误。 jni / JNIMagicCleanManager.cpp:84:错误:对函数abc的未定义引用(类似这样)

如何使用静态库libabc.a定义abc()我已将libabc.a放在与Android.mk并行的同一文件夹中。以下是我的Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
MAGIC_CLEAN_ROOT := ..
MAGIC_CLEAN_SRC_ROOT := ../$(LOCAL_PATH)/src
MAGIC_CLEAN_SRC_FILES := xyz.cpp
MAGIC_CLEAN_C_INCLUDES := $(LOCAL_PATH)/headers/

LOCAL_STATIC_LIBRARIES := magicClean
LOCAL_MODULE := myJniLib2


LOCAL_SRC_FILES := $(MAGIC_CLEAN_SRC_FILES)
LOCAL_C_INCLUDES := $(MAGIC_CLEAN_C_INCLUDES)
LOCAL_C_INCLUDES += .
include $(BUILD_SHARED_LIBRARY)

编辑1: 当我有静态库时,很多人都在问为什么我有abc.cpp,这只是为了保存代码。请告诉我如何从静态库调用该函数。

1 个答案:

答案 0 :(得分:1)

在使用LOCAL_STATIC_LIBRARIES之前,您需要使用此示例中的PREBUILT_STATIC_LIBRARY,此示例使用gnu static lib,但对您来说是相同的。

include $(CLEAR_VARS)

LOCAL_MODULE            := gnustl_static
LOCAL_CPPFLAGS += -std=c++11
LOCAL_SRC_FILES         := ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/thumb/libgnustl_static.a
LOCAL_EXPORT_C_INCLUDES := ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/include
LOCAL_EXPORT_C_INCLUDES += ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/include/

include $(PREBUILT_STATIC_LIBRARY)

你应该把它放在你的Android.mk