2012-03-26 8 views
19

यहां मैंने Android.mk फ़ाइल jni/ फ़ोल्डर में उपयोग की है।एंड्रॉइड एनडीके प्रोजेक्ट में प्रीबिल्ट साझा लाइब्रेरी को कैसे लिंक करें?

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 लाइब्रेरी से लिंक नहीं कर सकता।

तो कोई भी शरीर कृपया इस मुद्दे को हल करने में मेरी सहायता करें। आप

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

को
LOCAL_SHARED_LIBRARIES := packext 

बदलना होगा PREBUILTS.html

android-NDK/docs /:

+0

कर सकते हैं आप कृपया अपने प्रश्न को विस्तार से समझाएं? – Nimit

उत्तर

0

prebuilts के लिए NDK प्रलेखन पर एक नज़र डालें सुनिश्चित करें कि packext मॉड्यूल के लिए Android.mk युक्त आपके फ़ोल्डर को पैकक्स्ट नाम दिया जा सकता है और कर सकते हैं अपने NDK_MODULE_PATH में पाया जाए।

+0

यहां मैं अपने एंड्रॉइड.एमके और libpackext.so.1.0 को lib फ़ोल्डर में डालता हूं। यह lib फ़ोल्डर प्रोजेक्ट निर्देशिका पथ में है। जहां मैं jni फ़ोल्डर बना देता हूं – user1089679

2

आप निम्न में से या तो एक क्या करना है:

  1. काटें और LOCAL_PATH के अलावा सब कुछ पेस्ट: अपने पहले में अपने दूसरे Android.mk से = $ (मेरी-निर्देशिका कहते हैं)।

  2. अपना पहला Android.mk के अंत में निम्नलिखित रखो:

    $ (कॉल आयात मॉड्यूल, packext)

    यह भी सुनिश्चित करें कि आप एक पथ के लिए अपने NDK_MODULE_PATH वातावरण चर सेट है कि जहां मॉड्यूल पैकक्स्ट को परिभाषित एंड्रॉइड.एमके-फाइल पाया जा सकता है।

आपको पहले जवाब में mgiza ने उसी तरह LOCAL_SHARED_LIBRARIES को भी बदलना होगा। मुझे लगता है कि पैकेज एक्स्ट्राक्शन जिसे आपने अपरिभाषित संदर्भ दिया है, आपकी प्रीबिल्ट लाइब्रेरी में है, जब तक कि आपके पास अन्य लिंकिंग समस्याएं न हों, इससे समस्या हल होनी चाहिए।

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 

और JNI/armeabi/libffmpeg.so, JNI/armeabi-v7a/libffmpeg.so आदि पर एक libffmpeg.so जगह ..

+0

libffmpeg.so को jni फ़ोल्डर में क्यों होना चाहिए? सभी आर्किटेक्चर के साथ, इसे कैसे आसान बनाना है? – xgdgsc

+1

मैंने कई आर्किटेक्चर का समर्थन करने के तरीके को दिखाने के लिए उदाहरण को संशोधित किया। –

+0

@ डैनब्रू मुझे आपकी मदद की ज़रूरत है –

0

एंड्रॉयड NDK आधिकारिक hello-libs CMake उदाहरण

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

बस उबंटू 17.10 मेजबान पर मेरे लिए काम किया, एंड्रॉयड स्टूडियो 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) 
    
  • सी पर ++ कोड, उपयोग: #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

संबंधित मुद्दे

 संबंधित मुद्दे