2012-03-26 168 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

相關問題