Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将预构建的共享库链接到Android NDK项目?_Android_C_Android Ndk - Fatal编程技术网

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

如何将预构建的共享库链接到Android NDK项目?,android,c,android-ndk,Android,C,Android Ndk,这里我使用了jni/文件夹中的Android.mk文件 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_down

这里我使用了
jni/
文件夹中的
Android.mk
文件

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的未定义引用。在这里,我使用预构建库函数意味着我无法将预构建共享库链接到离线下载库


因此,请任何机构帮助我解决这个问题。

请查看预构建的ndk文档:

android ndk/docs/PREBUILTS.html

你必须改变

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


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

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

  • 将第二个Android.mk中除LOCAL_PATH:=$(call my dir)之外的所有内容剪切并粘贴到第一个Android.mk中

  • 在您的第一个Android.mk的末尾添加以下内容:

    $(调用导入模块,packext)

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


  • 您还必须按照mgiza在第一个答案中所说的方法更改本地共享库。我假设您未定义引用的packageExtraction位于预构建库中,因此除非您有其他链接问题,否则这应该可以解决问题。

    这里是一个完整的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中,将本地\u SRC\u文件更改为类似以下内容:

    LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libffmpeg.so
    

    然后将libffmpeg.so放在jni/armeabi/libffmpeg.so、jni/armeabi-v7a/libffmpeg.so等处。

    Android NDK官方
    你好libs
    CMake示例

    刚刚在Ubuntu 17.10主机、Android Studio 3、Android SDK 26、NDK 15.2上为我工作过。所以我强烈建议你把你的项目建立在这个基础上

    共享库称为
    libgperf
    ,关键代码部分包括:

    • :

    • 在C++代码中使用:<代码> >包含< /代码>

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

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

    • :

      然后,如果您查看设备上的
      /data/app
      下,
      libgperf.so
      也会出现

    • 如果您只支持某些体系结构,请参阅:


    示例git跟踪预构建的共享库,但它也包含实际构建它们的构建系统:

    您能详细解释一下您的问题吗?这里我把我的Android.mk和libpackext.so.1.0放在lib文件夹中。这个lib文件夹在项目目录路径中。我在那里制作jni文件夹为什么libffmpeg.so需要放在jni文件夹中?对于所有的体系结构,如何使其更简单?我修改了示例以演示如何支持多种体系结构。@danbrough我需要您的帮助也可以将外部libs放入
    jniLibs/…
    并使用:
    LOCAL\u SRC\u FILES:=…\jniLibs\$(TARGET\u ARCH\u ABI)\libffmpeg.so
    看看为android编译ffmpeg(或libav)的示例。
    LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libffmpeg.so
    
    // -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)
    
    android {
        sourceSets {
            main {
                // let gradle pack the shared library into apk
                jniLibs.srcDirs = ['../distribution/gperf/lib']