2014-11-06 45 views
0

如何为android构建一个外部C++库(静态或共享)?如何为android构建一个外部C++库(静态或共享)?

嗨,

目前我试图使用JNI从我的Android应用程序调用C++库。 一个简单的例子,我刚刚实现由jni生成的C++文件直接,工作正常。

现在我想生成一个外部C++库并在jni C++实现中调用它。 因此,jni实现只是定义了接口,整个功能都位于外部静态C++库中。

为此,我使用eclipse(ubuntu 32bit)创建了一个C++项目。

项目结构是这样的:


    StaticLibraryTest 
     -> src 
       -> bean -> Point 
       -> util -> Math 
         -> StringUtil 

该项目只是实现了简单的测试方法。

现在我有这个问题:如何构建这个项目,以便我可以在jni C++实现中使用它。我在执行ndk-build时遇到了问题。

我JNI文件夹的样子:


NativeTestProject 
    -> jni 
      -> calc -> de_tl_calc_SharedLibraryInterface.h 
        -> de_tl_calc_SharedLibraryInterface.cpp 

    -> inc 
      -> **/*.h(all header files from the external StaticLibraryTest library) 

    -> libStaticLibraryTest.a (my external library) 
    -> Application.mk (just containing the line: APP_ABI := all) 
    -> Android.mk 

Android.mk包含以下行:


    LOCAL_PATH := $(call my-dir) 
    include $(CLEAR_VARS) 
    LOCAL_MODULE := libStaticLibraryTest 
    LOCAL_SRC_FILES := libStaticLibraryTest.a 
    include $(PREBUILT_STATIC_LIBRARY) 

    include $(CLEAR_VARS) 
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc 
    LOCAL_SRC_FILES := calc/de_tl_calc_SharedLibraryInterface.cpp 
    LOCAL_MODULE  := de_tl_calc_SharedLibraryInterface 
    LOCAL_STATIC_LIBRARIES := libStaticLibraryTest 
    include $(BUILD_SHARED_LIBRARY) 

我会非常高兴,如果有人可以帮助我找到了正确的道路。

编辑:

我想我做了下一步。我创建了ARM-Linux的gnueabi外部静态库,现在我得到了以下错误执行NDK建造:


$ ndk-build 
[arm64-v8a] Compile++  : de_tl_calc_SharedLibraryInterface <= de_tl_calc_SharedLibraryInterface.cpp 
[arm64-v8a] SharedLibrary : libde_tl_calc_SharedLibraryInterface.so 
collect2.exe: error: ld returned 5 exit status 
/cygdrive/k/android-ndk64-r10-windows-x86_64/build/core/build-binary.mk:647: recipe for target 'obj/local/arm64-v8a/libde_tl_calc_SharedLibraryInterface.so' failed 
make: *** [obj/local/arm64-v8a/libde_tl_calc_SharedLibraryInterface.so] Error 1 
make: *** Deleting file 'obj/local/arm64-v8a/libde_tl_calc_SharedLibraryInterface.so' 

回答

0

你使用LOCAL_SRC_FILES := libStaticLibraryTest.a宣告您的预构建的静态库。 这意味着在为所有NDK支持的体系结构进行编译时将使用该.a文件,但由于每个体系结构都需要一个不同的体系结构,因此无法使用该文件。

你应该编译。一个为所有支持的体系结构,并把它的子文件夹(armeabi-V7A,X86,arm64-V8A,x86_64的...),所以你可以合理地利用这样的事情包括它:

LOCAL_SRC_FILES := prebuilts/$(TARGET_ARCH_ABI)/libStaticLibraryTest.a