【问题标题】:How to build an external c++ library (static or shared) for android?如何为 android 构建外部 c++ 库(静态或共享)?
【发布时间】:2015-01-02 17:31:11
【问题描述】:

如何为 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-build 时出现以下错误:


$ ndk-build
[arm64-v8a] Compile++      : de_tl_calc_SharedLibraryInterface &lt= 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'

【问题讨论】:

    标签: android c++ static android-ndk java-native-interface


    【解决方案1】:

    您正在使用LOCAL_SRC_FILES := libStaticLibraryTest.a 来声明您的预构建静态库。 这意味着在编译 NDK 支持的所有架构时将使用此 .a 文件,但这不起作用,因为您需要为每个架构使用不同的文件。

    您应该为所有受支持的架构编译您的 .a 并将其放在子文件夹(armeabi-v7a、x86、arm64-v8a、x86_64...)下,这样您就可以使用以下方式正确包含它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 2013-03-28
      相关资源
      最近更新 更多