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

use*_*679 21 c android android-ndk

这里我Android.mkjni/文件夹中使用了这个文件.

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

所以任何人都请帮我解决这个问题.

Dan*_*ugh 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)
Run Code Online (Sandbox Code Playgroud)

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

APP_ABI := armeabi armeabi-v7a x86 mips
Run Code Online (Sandbox Code Playgroud)

在您的jni/Application.mk中,将LOCAL_SRC_FILES更改为:

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libffmpeg.so
Run Code Online (Sandbox Code Playgroud)

并在jni/armeabi/libffmpeg.so,jni/armeabi-v7a/libffmpeg.so等处放置libffmpeg.so.


Cir*_*四事件 5

Android NDK官方hello-libsCMake示例

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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 在C ++代码上,使用: #include <gperf.h>

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

  • 库位置: 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']
    
    Run Code Online (Sandbox Code Playgroud)

    然后,如果您/data/app在设备下看,它libgperf.so也会在那里。

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

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


mgi*_*iza 0

查看预构建的 ndk 文档:

android-ndk/docs/PREBUILTS.html

你必须改变

LOCAL_SHARED_LIBRARIES :=../lib/libpackext.so.1.0
Run Code Online (Sandbox Code Playgroud)

LOCAL_SHARED_LIBRARIES := packext
Run Code Online (Sandbox Code Playgroud)

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