【问题标题】:NDK: How to include Prebuilt Shared Library Regardless of ArchitectureNDK:如何在不考虑架构的情况下包含预构建的共享库
【发布时间】:2013-06-18 14:55:34
【问题描述】:

我正在移植 Box2D 以了解更多关于 android 移植的知识。

我可以编译项目,我看到以下内容......

ls 库/

armeabi armeabi-v7a

现在我想做this 之类的事情,但我不知道如何让它变得足够聪明来选择拱门(比如我想添加 x86)。如何在不将 .so 路径硬编码到规范架构的情况下包含 .so?

【问题讨论】:

    标签: android-ndk


    【解决方案1】:

    按照 NDK 文档(APPLICATION-MK.html 和 PREBUILTS.html)中的描述,在 android.mk 和 Application.mk 中简单定义您希望支持的架构:

    V. ABI 选择预构建的二进制文件:

    如前所述,提供预构建的共享库至关重要 在构建期间与目标 ABI 兼容。要做到这一点, 检查 TARGET_ARCH_ABI 的值,其值为:

    armeabi => 当面向 ARMv5TE 或更高 CPU 时 armeabi-v7a => 针对 ARMv7 或更高版本的 CPU x86 => 针对 x86 CPU 时 mips => 针对 MIPS CPU 时

    请注意,armeabi-v7a 系统可以正常运行 armeabi 二进制文件。

    这是一个示例,我们提供了两个版本的预构建库 并根据目标ABI选择复制哪一个:

    include $(CLEAR_VARS)
    LOCAL_MODULE := foo-prebuilt
    LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
    include $(PREBUILT_SHARED_LIBRARY)
    

    这里。我们假设要复制的预建库位于 以下目录层次结构:

    Android.mk            --> the file above
    armeabi/libfoo.so     --> the armeabi prebuilt shared library
    armeabi-v7a/libfoo.so --> the armeabi-v7a prebuilt shared library
    include/foo.h         --> the exported header file
    

    注意:请记住,您不需要提供 armeabi-v7a 预构建 库,因为 armeabi 可以轻松地在相应的库上运行 设备。

    【讨论】:

    • 看起来你是在我的回答之后,这几乎是一样的。感谢您的帮助!
    【解决方案2】:

    这行得通...

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := box2D-prebuilt
    LOCAL_SRC_FILES := ../Box2D/libs/$(TARGET_ARCH_ABI)/libbox2D.so
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/..
    include $(PREBUILT_SHARED_LIBRARY)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE    := box2DHello
    LOCAL_SRC_FILES := \
        $(subst $(LOCAL_PATH)/,, \
        $(wildcard $(LOCAL_PATH)/*.cpp))
    LOCAL_LDLIBS := -lm -llog
    LOCAL_SHARED_LIBRARIES := box2D-prebuilt
    include $(BUILD_SHARED_LIBRARY)
    

    【讨论】:

    • 我面临同样的问题,但我只需要使用 .so 文件。我已按照您的指示编写 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := box2D-prebuilt LOCAL_SRC_FILES := ../Box2D/libs/$(TARGET_ARCH_ABI)/libbox2D.so LOCAL_EXPORT_C_INCLUDES := $( LOCAL_PATH)/.. 包括 $(PREBUILT_SHARED_LIBRARY) 但这会在 prebuiltlibaray.mk 中给出错误
    【解决方案3】:

    Android NDK 官方hello-libsCMake 示例

    https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs

    关键是打包你关心的.so的所有版本,例如:

    • distribution/gperf/lib/arm64-v8a/libgperf.so
    • distribution/gperf/lib/x86_64/libgperf.so

    然后在 CMake 上选择正确的一个:${ANDROID_ABI}

    我已经在How to link a prebuilt shared Library to an Android NDK project?进一步解释了这个例子

    【讨论】:

      【解决方案4】:

      任何正在寻找有关任何 android.mk 问题的良好文档的人,请参考:

      https://github.com/Parrot-Developers/alchemy/blob/master/doc/android-mk.html

      我发现它用简单的语言很好地解释并涵盖了围绕 Android.mk 的大部分场景。希望对您有所帮助。

      【讨论】:

        【解决方案5】:

        libmath-prebuilt.so 是一个预建库,它有一些供 buyya_read.c 使用的函数。首先使用 ndk-build 生成 libmath-prebuilt.so 并保存在 jni 文件夹中,其中 buyya_read.c 保存在您的项目中的 elcipse 中。

        Android.mk(To generate libbuyya_read.so to use as jni library using prebuilt library)
            LOCAL_PATH := $(call my-dir)
            include $(CLEAR_VARS)
            LOCAL_MODULE := math-prebuilt
            LOCAL_SRC_FILES = libmath-prebuilt.so
            include $(PREBUILT_SHARED_LIBRARY)
        
            include $(CLEAR_VARS)
            LOCAL_MODULE    := buyya_read
            LOCAL_SRC_FILES := buyya_read.c
            LOCAL_LDLIBS    := -llog
            LOCAL_SHARED_LIBRARIES := math-prebuilt
            include $(BUILD_SHARED_LIBRARY)
        
        buyya_read.c
        #include <termios.h>
        #include <unistd.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>
        #include <string.h>
        #include <jni.h>
        #include <stdio.h>
        
        JNIEXPORT jint JNICALL Java_com_buyya_BuyyaJava_sum(JNIEnv *env,
            jclass thiz, jint a, jint b) {
        hello();
        int res = add(a, b);
        return res;
        }
        
        math.c // using this generate libmath-prebuilt.so
        #include <stdio.h>
        void hello()
        {
            printf("Hello world!\n");
        }
        int add(int a, int b)
        {
            printf("Hello world!\n");
            return a+b;
        }
        
        Make file to generate libmath-prebuilt.so
        Android.mk
            LOCAL_PATH := $(call my-dir)
            include $(CLEAR_VARS)
            LOCAL_MODULE    := math-prebuilt
            LOCAL_SRC_FILES := math.c
            LOCAL_LDLIBS    := -llog
            #LOCAL_EXPORT_C_INCLUDES:=../jni/
            include $(BUILD_SHARED_LIBRARY)
        

        您可以在下图中看到项目目录结构。

        【讨论】:

          猜你喜欢
          • 2012-01-07
          • 1970-01-01
          • 1970-01-01
          • 2012-03-01
          • 2011-12-17
          • 1970-01-01
          • 1970-01-01
          • 2012-04-09
          • 1970-01-01
          相关资源
          最近更新 更多