2012-03-26 13 views
19

Qui ho utilizzato questo file Android.mk nella cartella jni/.Come collegare una libreria condivisa precompilata a un progetto NDK 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) 

fa 'un lib cartella nella directory del progetto e mettere la mia precompilati .so biblioteca e fare uno Android.mk file che contiene i seguenti

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) 

e quando uso ndk-build -B comando che ho ottenuto undefined reference to packageExtraction. Qui utilizzo le mie funzioni di libreria preconfigurate significa che non posso collegare la mia libreria condivisa precompattata alla mia libreria offlinedownload.

Quindi qualsiasi corpo, per favore, aiutami a risolvere questo problema.

+0

Can per favore spiega la tua domanda in dettaglio? – Nimit

risposta

0

Dai un'occhiata alla documentazione NDK per prebuilts:

Android NDK/docs/PREBUILTS.html

devi cambiare

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

a

LOCAL_SHARED_LIBRARIES := packext 

Assicurati che la tua cartella contenente Android.mk per il modulo packext sia denominata packext e can essere trovato nel tuo NDK_MODULE_PATH.

+0

Qui ho messo il mio Android.mk e libpackext.so.1.0 nella cartella lib. Questa cartella lib è nel percorso della directory del progetto. Dove creo la cartella jni – user1089679

2

quello che dovete fare uno di quanto segue:

  1. tagliare e incollare tutto tranne local_path: = $ (chiamare il mio-dir) dal secondo Android.mk Il primo proprio.

  2. Inserire il seguente alla fine del vostro primo Android.mk:

    $ (chiamata Import-Module, packext)

    anche fare in modo di impostare la variabile ambiente NDK_MODULE_PATH ad un percorso in cui il È possibile trovare il file Android.mk che definisce il modulo packext.

È inoltre necessario modificare LOCAL_SHARED_LIBRARIES nello stesso modo in cui mgiza ha detto nella prima risposta. Suppongo che il packageExtraction a cui hai un riferimento indefinito sia presente nella libreria precostruita, quindi, a meno che tu non abbia altri problemi di collegamento, questo dovrebbe risolvere il problema.

33

Questo è un file Android.mk completo per l'utilizzo di una libreria condivisa di terze parti. La libreria (libffmpeg.so) si trova nella cartella jni. Il suo "LOCAL_EXPORT_C_INCLUDES" specifica dove sono conservati i file di intestazione per la libreria.

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) 

Se si voleva supportare architetture multiple, allora è possibile specificare:

APP_ABI := armeabi armeabi-v7a x86 mips 

nel vostro JNI/Application.mk e cambiare le LOCAL_SRC_FILES a qualcosa di simile:

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libffmpeg.so 

e posizionare un libffmpeg.so a JNI/armeabi/libffmpeg.so, JNI/armeabi-V7A/libffmpeg.so ecc ..

+0

Perché il libffmpeg.so deve essere nella cartella jni? Con tutte le architetture, come renderlo più facile? – xgdgsc

+1

Ho modificato l'esempio per mostrare come supportare più architetture. –

+0

@danbrough ho bisogno del tuo aiuto –

0

Android NDK ufficiale hello-libs CMake esempio

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

appena finito di lavorare per me su Ubuntu 17.10 ospite, Android Studio 3, Android SDK 26, NDK 15.2. quindi ti consiglio vivamente di basare il tuo progetto su di esso.

La libreria condivisa si chiama libgperf, le parti di codice chiave sono:

  • hello-libs/app/src/main/cpp/CMakeLists.txt:

    codice
    // -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) 
    
  • su C++, utilizzo: #include <gperf.h>

  • posizione intestazione: hello-libs/distribution/gperf/include/gperf.h

  • posizione 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'] 
    

    Poi, se si guarda sotto /data/app sul dispositivo, libgperf.so sarà anche lì.

  • Se si supportano solo alcune architetture, vedi: Gradle Build NDK target only ARM

L'esempio git traccia le librerie predefinite condivise, ma contiene anche il sistema di generazione di costruire effettivamente così: https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs/gen-libs

Problemi correlati