2013-01-25 15 views
15

Sto usando il codice nativo nella mia app per Android. In primo luogo stavo usando solo una libreria. Quindi tutto ha funzionato bene. Ma ora devo integrare un'altra libreria in essa. Non ho idea di quale dovrebbe essere la struttura ideale della cartella jni del mio progetto (come in dove posizionare l'intero codice, ecc.). Ho trovato un lavoro in giro. Ho creato due cartelle all'interno di jni .i.e library1 e library2. Di nuovo creato una cartella jni all'interno di entrambe le cartelle e inserito il rispettivo codice nelle cartelle.NDK che compila più librerie

Ho ottenuto la compilazione. Entrambi i file .so vengono generati, ma non riesco a utilizzarlo nella mia applicazione. Non riesco a caricare la libreria usando System.loadLibrary ("library1.so"); Ho anche provato a fornire il percorso completo. Ma fallito

Inoltre non ho idea di cosa scrivere all'interno del file Android.mk della cartella genitore jni.

struttura attuale: project_folder -> JNI -> library1 -> JNI -> "codice sorgente" di un Android.mk è scritto qui project_folder -> JNI -> Library2 -> JNI -> "codice sorgente" di Android .mk è scritto qui

UPDATE # 1:

Gdbserver  : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver 
Gdbsetup  : libs/armeabi/gdb.setup 
make: *** No rule to make target `jni/zap/jni/zap/zap/error.c', needed by `obj/local/armeabi/objs-debug/zap/jni/zap/zap/error.o'. Stop. 

io non sto usando Application.mk. Questo è il mio Android.mk:

TOP_PATH := $(call my-dir) 

# Build library 1 
include $(CLEAR_VARS) 
LOCAL_PATH := $(TOP_PATH)/zap 
LOCAL_MODULE := zap 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/zap 
LOCAL_SRC_FILES := $(LOCAL_PATH)/zap/error.c \ 
$(LOCAL_PATH)/zap/hello-jni.c \ 
$(LOCAL_PATH)/zap/zap.c \ 
$(LOCAL_PATH)/zap/zapd.c \ 
$(LOCAL_PATH)/zap/zaplib.c 
include $(BUILD_SHARED_LIBRARY) 

risposta

20

La struttura migliore che ho trovato è quello di utilizzare la JNI/cartella per NDK-costruire makefile solo, e mantenere la fonte esterna nelle proprie cartelle. Questo è facile da aggiungere ai progetti esistenti senza ristrutturare l'albero sotto jni.

Tuttavia, è necessario fare attenzione a come si gestisce la variabile LOCAL_PATH e l'uso di $ (chiamare my-dir). Ecco un esempio di lavoro:

  • MyProject/
    • library1/
      • source1.cpp
    • Library2/
      • source2.cpp
    • JNI/
      • Android.mk
      • Application.mk

Android.mk:

# TOP_PATH refers to the project root dir (MyProject) 
TOP_PATH := $(call my-dir)/.. 

# Build library 1 
include $(CLEAR_VARS) 
LOCAL_PATH := $(TOP_PATH)/library1 
LOCAL_MODULE := library1 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 
LOCAL_SRC_FILES := source1.cpp 
include $(BUILD_SHARED_LIBRARY) 

# Build library 2 
include $(CLEAR_VARS) 
LOCAL_PATH := $(TOP_PATH)/library2 
LOCAL_MODULE := library2 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 
LOCAL_SRC_FILES := source2.cpp 
include $(BUILD_SHARED_LIBRARY) 

è possibile, facoltativamente dividere le sezioni in Android.mk alla propria makefile.

+2

Inoltre, quando si utilizza loadLibrary, lasciare fuori la parte ".so", per esempio Sistema.LoadLibrary ("Library1"). – safety

+0

Ho provato il tuo suggerimento. Ho iniziato con la prima libreria (lo zap è il suo nome, quindi la cartella). Ma sto ricevendo un errore di compilazione. Non so come inserire il codice in un commento. Si prega di controllare l'aggiornamento # 1. Grazie –

+0

Se Android.mk è a /jni/Android.mk, quindi TOP_PATH deve essere impostato su $ (chiama my-dir)/.. – safety

0

ho scoperto che durante la compilazione dalla riga di comando, posso includere librerie multiple eseguendo android update project due volte, una volta con ogni libreria:

android update project -l ../SDK/library1/ --path . --name $name --target 23 --subprojects 
android update project -l ../SDK/library2/ --path . --name $name --target 23 --subprojects 
ant release 
Problemi correlati