如何将预建的共享库链接到Android NDK项目?

时间:2012-03-26 10:24:59

标签: android c android-ndk

我在Android.mk文件夹中使用了这个jni/文件。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Here we give our module name and source file(s)
LOCAL_MODULE    := offlineDownload
LOCAL_SRC_FILES := offline_download.c

LOCAL_SHARED_LIBRARIES :=../lib/libpackext.so.1.0
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

include $(BUILD_SHARED_LIBRARY)

在项目目录中创建一个lib文件夹并放入我预先构建的.so库并制作一个包含以下内容的Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := packext
LOCAL_SRC_FILES := libpackext.so.1.0
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include

include $(PREBUILT_SHARED_LIBRARY)

当我使用ndk-build -B命令而不是未定义引用packageExtraction 时。在这里,我使用我的预建库函数意味着我无法将我的预建共享库链接到我的offlinedownload库。

所以任何人都可以帮我解决这个问题。

4 个答案:

答案 0 :(得分:35)

这是一个完整的Android.mk文件,用于使用第三方共享库。 库(libffmpeg.so)放在jni文件夹中。 它的“LOCAL_EXPORT_C_INCLUDES”指定为库保存头文件的位置。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../ffmpeg/libs/arm-linux-androideabi4.7_1/include
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE    := ffmpegandroid
LOCAL_SRC_FILES := ffmpegandroid.c
LOCAL_SHARED_LIBRARIES := ffmpeg
include $(BUILD_SHARED_LIBRARY)

如果您想支持多种体系结构,那么您可以指定:

APP_ABI := armeabi armeabi-v7a x86 mips
在您的jni / Application.mk中

并将LOCAL_SRC_FILES更改为:

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libffmpeg.so

并将libffmpeg.so放在jni / armeabi / libffmpeg.so,jni / armeabi-v7a / libffmpeg.so等。

答案 1 :(得分:2)

您必须执行以下任一操作:

  1. 将第二个Android.mk中除LOCAL_PATH:= $(调用my-dir)之外的所有内容剪切并粘贴到您的第一个。

  2. 将以下内容放在第一个Android.mk的末尾:

    $(调用import-module,packext)

    另外,请确保将NDK_MODULE_PATH环境变量设置为可以找到定义模块packext的Android.mk文件的路径。

  3. 您还必须以与mgiza在第一个答案中所述相同的方式更改LOCAL_SHARED_LIBRARIES。我认为你获得未定义引用的packageExtraction是在你的预构建库中,所以除非你有其他链接问题,否则这应该可以解决问题。

答案 2 :(得分:2)

Android NDK官方hello-libs CMake示例

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

刚刚在Ubuntu 17.10主机,Android Studio 3,Android SDK 26,NDK 15.2上为我工作。所以我强烈建议您将项目建立在它上面。

共享库名为libgperf,关键代码部分为:

  • hello-libs/app/src/main/cpp/CMakeLists.txt

    // -L
    add_library(lib_gperf SHARED IMPORTED)
    set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION
              ${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so)
    
    // -I
    target_include_directories(hello-libs PRIVATE
                               ${distribution_DIR}/gperf/include)
    // -lgperf
    target_link_libraries(hello-libs
                          lib_gperf)
    
  • 关于C ++代码,请使用:#include <gperf.h>

  • 标题位置:hello-libs/distribution/gperf/include/gperf.h

  • lib位置:distribution/gperf/lib/arm64-v8a/libgperf.so

  • app/build.gradle

    android {
        sourceSets {
            main {
                // let gradle pack the shared library into apk
                jniLibs.srcDirs = ['../distribution/gperf/lib']
    

    然后,如果您在设备上查看/data/applibgperf.so也会在那里。

  • 如果您只支持某些体系结构,请参阅:Gradle Build NDK target only ARM

示例git跟踪预构建的共享库,但它也包含实际构建它们的构建系统:https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs/gen-libs

答案 3 :(得分:0)

查看prebuilts的ndk文档:

机器人-NDK /文档/ PREBUILTS.html

你必须改变

LOCAL_SHARED_LIBRARIES :=../lib/libpackext.so.1.0

LOCAL_SHARED_LIBRARIES := packext

确保包含Packext模块的Android.mk的文件夹名为packext,并且可以在NDK_MODULE_PATH中找到。