Come utilizzare un progetto di libreria con c e java apis su Android

Ho fatto questa domanda nel gruppo google android-ndk, ma non ho ricevuto alcuna risposta.

Sto provando a build un module comune in un progetto indipendente facendo clic sul "Is Library" è eclipse. Questo progetto fornisce sia c apis che java apis. Mentre alcuni di questi apis sono correlati. (significa che non è una buona idea separarli in 2 progetti). Diciamo che è comune e libcommon.so.

  • Imballaggio RAA AAC in contenitore m4a?
  • Come faccio a creare una funzionalità simile a JQuery Slider per l'applicazione iPhone / Android?
  • Build non riesce con l'app: transformClassesAndResourcesWithProguardForRelease sull'aggiornamento della versione gradle a 2.3.3
  • Android cosa fa l'attributo clipToPadding?
  • Come eseguire un'attività solo una volta come la schermata Splash
  • setOnItemSelectedListener di Spinner non chiama
  • Quando sto usando questa libreria in un altro progetto (supponiamo testcommon), aggiungo il progetto comune come libreria in eclipse all'esploratore di progetti -> properties; -> Android -> Libreria -> Aggiungi. Ma questo mi rende solo ansible utilizzare java apis nella biblioteca.

    Inoltre, aggiungo libcommon.so come PREBUILT_SHARED_LIBRARY in android.mk in progetto testcommon in modo da poter accedere a c apis. ( come sotto )

    include $(CLEAR_VARS) LOCAL_MODULE := common-prebuilt LOCAL_SRC_FILES := ../../common/libs/$(TARGET_ARCH_ABI)/libcommon.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := testCommon LOCAL_SRC_FILES := testCommon.c LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../common/jni/include/ LOCAL_SHARED_LIBRARIES := common-prebuilt include $(BUILD_SHARED_LIBRARY) 

    In questo modo, ndk-build è il successo, ma quando lo sto eseguendo, mi trovo sotto gli errori:

     [2012-02-29 15:28:20 - testCommon] Error generating final archive: Found duplicate file for APK: lib/armeabi/libcommon.so Origin 1: E:\Code\EclipseWorkspace\testCommon\libs\armeabi\libcommon.so Origin 2: E:\Code\EclipseWorkspace\Common\libs\armeabi\libcommon.so 

    Penso che perché entrambi i riferimenti alla biblioteca condivisa e la libreria pre-build siano aggiunti a libcommon.so al progetto testcommon. Infatti, ho provato a riferirmi solo alla libreria o ad aggiungere una libreria condivisa di pre-build, entrambi hanno copiato libcommon.so per testcommon.

    La domanda è che cosa devo fare se ho bisogno di una libreria con c e java apis (non solo codice)

    Grazie


    Dopo aver letto la biblioteca condivisa può call un'altra libreria condivisa? Ho trovato un modo per risolvere questo problema, ma ancora non molto sicuro.

    Utilizza sotto la row in Android.mk anziché PREBUILT_SHARED_LIBRARY anche fare lavori di parti nativi e le librerie non verranno copiate in questo modo. In modo che la copia duplicata potrebbe essere risolta.

     LOCAL_LDFLAGS := -L$(LOCAL_PATH)/../../Common/libs/$(TARGET_ARCH_ABI)/ -lcommon 

    Il motivo per cui questo non potrebbe funzionare nel mio primo test è che anche in questo modo, entrambe le librerie devono essere caricate in java, ma non solo libtestCommon.

     System.loadLibrary("common"); // I lost this in my before test System.loadLibrary("testCommon"); 

    Penso che sia chiaro per me adesso.

    Entrambe LOCAL_SHARED_LIBRARIES e -L plus -l dovrebbero funzionare bene in NDK.

    Il problema è che quando chiamo

     System.loadLibrary("testCommon") 

    cercherà di trovare i file in / data / data / $ (path dell'app) / lib (System.java::Leach -> Runtime.java::Leach -> DexPathList.java::findLibrary) ma quando libtestCommon prova per trovare la sua dipendenza libCommon.so, lo troverà solo a / vendor / lib e / system / lib poiché

     LD_LIBRARY_PATH=/vendor/lib:/system/lib. 

    Se chiamo System.loadLibrary ("comune") prima, dlopen lo caricherà in cache (Linker.c :: alloc_info). Questo rende libtestCommon.so carica libCommon.so successo credo. Quindi tutto funziona.

    Ho anche notato queste parole alla fine di SYSTEM-ISSUES.html in ndk-r7:

    • Un bug impedisce una libreria condivisa di un'applicazione a seconda di un'altra. Ad esempio, se crei sia libfoo.so che libbar.so per l'applicazione, e elenca libfoo.so come dipendenza per libbar.so in bar / Android.mk (con LOCAL_SHARED_LIBRARIES: = foo), quindi caricando libbar.so sempre fallito, anche se hai già caricato libfoo.so nel tuo process.

    C'è un po 'diverso. Se ho già caricato libfoo.so nel mio process, libbar.so avrà successo.

    Quindi, rispondi finalmente è:

    • Utilizza LOCAL_LDFLAGS: = -Lxx -lxx se hai bisogno di librerie condivise nel progetto della libreria android.
    • Devi call System.loadLibrary per tutte le librerie condivise necessarie. Questo è anche il modo per utilizzare un'altra libreria condivisa in una libreria.
    • Il path delle librerie in / libs / viene collocato in / data / data // lib /.

  • Aggiungi "menu" su each voce di listview
  • Come abilitare in modo programmato il GPS in Cupcake Android
  • Come posso implementare SlideShow in android?
  • Come trovare l'ultima attività da cui viene aperta l'attività corrente in android?
  • Ottieni il tag di referrer Android Google Analytics
  • Che cosa è l'uso di android: supportsRtl = "true" nel file xml di AndroidManifest
  • 2 Solutions collect form web for “Come utilizzare un progetto di libreria con c e java apis su Android”

    Come opzione è ansible utilizzare

    LOCAL_ALLOW_UNDEFINED_SYMBOLS: = true

    in uno di Android.mk e escludi il duplicato lib.

    Ho lottato con un problema simile. Voglio build un progetto di libreria Android con Java e C. Voglio che Java dei progetti dipendenti sia in grado di fare riferimento al codice C del codice Java e dei progetti dipendenti della biblioteca in JNI per poter fare riferimento al C nella libreria jni. Ho richiesto due kludges. Uno è quasi identico alla tua soluzione:

     LOCAL_LDFLAGS := -L$(LOCAL_PATH)/../../Common/libs/$(TARGET_ARCH_ABI)/ -lcommon 

    Ho creato una dipendenza dalla posizione effettiva del progetto della libreria nel file system. La tua dipendenza presuppone che il progetto Common Library è una directory di fratelli del tuo progetto TestCommon dipendente.

    Ho anche creato un file build.xml Ant che copia i file di intestazione C dal progetto di libreria in una directory jni / include nella cartella dipendente jni.

    Con questi due kludges, sono in grado di get tutto funzionante. Vorrei davvero eliminare entrambi i kludges, ma non ho potuto trovare un modo.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.