2012-03-26 99 views
19

这里我在jni/文件夹中使用这个Android.mk文件。如何将预建的共享库链接到Android NDK项目?

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库。

所以任何机构请帮我解决这个问题。

+0

能你请详细解释你的问题? – Nimit 2012-03-26 12:44:51

回答

0

看一看NDK的文档prebuilts:

的Android NDK /文档/ PREBUILTS.html

你必须改变

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

LOCAL_SHARED_LIBRARIES := packext 

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

+0

在这里,我把我的Android.mk和libpackext.so.1.0放在lib文件夹中。这个lib文件夹在项目目录path.where我使jni文件夹 – user1089679 2012-03-28 01:42:40

2

你必须做下列之一:

  1. 剪切和LOCAL_PATH除外的所有内容粘贴:从你的第二个Android.mk = $(叫我-DIR)到你的第一个。

  2. 把下面的在你第一次Android.mk结束:

    $(电话进口模块,packext)

    另外,还要确保您在NDK_MODULE_PATH环境变量设置为路径,其中可以找到定义模块包文本的Android.mk文件。

您还必须更改LOCAL_SHARED_LIBRARIES,就像mgiza在第一个答案中所说的那样。我想你未定义引用的packageExtraction是在你的预建库中,所以除非你有其他的链接问题,这应该解决这个问题。

33

以下是使用第三方共享库的完整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 /应用。MK和改变LOCAL_SRC_FILES喜欢的东西:

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libffmpeg.so 

,并放置在libffmpeg.so JNI/armeabi/libffmpeg.so,JNI/armeabi-V7A/libffmpeg.so等。

+0

为什么libffmpeg.so需要在jni文件夹中?有了所有的架构,如何使它更容易? – xgdgsc 2013-05-20 13:16:08

+1

我修改了示例以显示如何支持多种体系结构。 – 2013-05-20 20:40:53

+0

@danbrough我需要你的帮助 – 2015-01-05 09:27:50

0

的Android NDK官方hello-libs CMake的例子

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

只是为我工作的Ubuntu 17.10主机上,Android的工作室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/app下看设备上,libgperf.so将在那里为好。

  • 如果你只支持某些架构,请参阅:Gradle Build NDK target only ARM

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