2012-03-26 31 views
19

Ở đây tôi đã sử dụng tệp này Android.mk trong thư mục jni/.Làm cách nào để liên kết Thư viện được chia sẻ sẵn với dự án NDK của Android?

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) 

Và chắc một lib thư mục trong thư mục dự án và đưa được xây dựng sẵn của tôi .so thư viện và làm cho một Android.mk tập tin đó chứa sau

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) 

Và khi tôi sử dụng ndk-build -B lệnh hơn tôi đã nhận tài liệu tham khảo không xác định để packageExtraction. Ở đây tôi sử dụng các chức năng thư viện dựng sẵn của mình có nghĩa là tôi không thể liên kết thư viện được dựng sẵn của tôi với thư viện offlinedownload của tôi.

Vì vậy, mọi người vui lòng giúp tôi giải quyết vấn đề này.

+0

thể bạn vui lòng giải thích câu hỏi của bạn một cách chi tiết? – Nimit

Trả lời

0

Có xem xét các tài liệu ndk cho prebuilts:

android-ndk/docs/PREBUILTS.html

Bạn phải thay đổi

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

để

LOCAL_SHARED_LIBRARIES := packext 

Hãy chắc chắn rằng thư mục của bạn chứa Android.mk cho mô-đun packext được đặt tên là packext và có thể được tìm thấy trong NDK_MODULE_PATH của bạn.

+0

Ở đây tôi đặt Android.mk và libpackext.so.1.0 vào thư mục lib. Thư mục lib này nằm trong thư mục dự án path.where tôi tạo thư mục jni – user1089679

2

Bạn phải làm một trong hai điều sau đây:

  1. Cắt và dán tất cả mọi thứ trừ LOCAL_PATH: = $ (gọi my-dir) từ Android.mk thứ hai của bạn vào đầu tiên của bạn.

  2. Đặt sau vào cuối Android.mk đầu tiên của bạn:

    $ (gọi nhập module, packext)

    Ngoài ra hãy chắc chắn rằng bạn thiết lập biến môi trường NDK_MODULE_PATH của bạn đến một con đường nơi Bạn có thể tìm thấy tệp Android.mk xác định mô-đun packext.

Bạn cũng phải thay đổi LOCAL_SHARED_LIBRARIES theo cùng cách mà mgiza đã nói trong câu trả lời đầu tiên. Tôi cho rằng packageExtraction mà bạn có tham chiếu không xác định là trong thư viện dựng sẵn của bạn vì vậy trừ khi bạn có vấn đề liên kết khác, điều này sẽ giải quyết vấn đề.

33

Đây là tệp Android.mk hoàn chỉnh để sử dụng thư viện được chia sẻ của bên thứ ba. Thư viện (libffmpeg.so) được đặt trong thư mục jni. "LOCAL_EXPORT_C_INCLUDES" của nó chỉ định nơi lưu giữ các tệp tiêu đề cho thư viện.

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) 

Nếu bạn muốn hỗ trợ nhiều kiến ​​trúc thì bạn có thể ghi rõ:

APP_ABI := armeabi armeabi-v7a x86 mips 

trong JNI bạn/Application.mk và thay đổi LOCAL_SRC_FILES một cái gì đó như:

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libffmpeg.so 

và đặt một libffmpeg.so tại JNI/armeabi/libffmpeg.so, JNI/armeabi-v7a/libffmpeg.so vv ..

+0

Tại sao libffmpeg.so cần nằm trong thư mục jni? Với tất cả các kiến ​​trúc, làm thế nào để làm cho nó dễ dàng hơn? – xgdgsc

+1

Tôi đã sửa đổi ví dụ để hiển thị cách hỗ trợ nhiều kiến ​​trúc. –

+0

@danbrough tôi cần sự giúp đỡ của bạn –

0

Android NDK chính thức hello-libs CMake dụ

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

Chỉ cần làm việc cho tôi trên Ubuntu 17.10 sở tại, Android Studio 3, Android SDK 26, NDK 15.2. vì vậy tôi khuyên bạn nên xây dựng dự án của bạn trên đó.

Thư viện chia sẻ được gọi là libgperf, các bộ phận mã chủ chốt là:

  • 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) 
    
  • trên C++, sử dụng: #include <gperf.h>

  • vị trí tiêu đề: hello-libs/distribution/gperf/include/gperf.h

  • lib vị trí: 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'] 
    

    Sau đó, nếu bạn nhìn dưới /data/app trên thiết bị, libgperf.so sẽ ở đó là tốt.

  • Nếu bạn chỉ hỗ trợ một số kiến ​​trúc, xem: Gradle Build NDK target only ARM

Ví dụ git theo dõi các thư viện dựng sẵn được chia sẻ, nhưng nó cũng chứa các hệ thống xây dựng để thực sự xây dựng chúng cũng như: https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs/gen-libs

Các vấn đề liên quan