2013-01-25 12 views
15

Używam natywnego kodu w mojej aplikacji na Androida. Po pierwsze korzystałem tylko z jednej biblioteki. Wszystko działało dobrze. Ale teraz muszę zintegrować z nim jeszcze jedną bibliotekę. Nie mam pojęcia, jaka powinna być idealna struktura folderu jni mojego projektu (jak gdzie umieścić cały kod, itp.). Znalazłem pracę. Wewnątrz jni .i.e library1 i library2 utworzyłem dwa foldery. Ponownie stworzyłem folder jni wewnątrz obu folderów i umieściłem odpowiedni kod w folderach.NDK kompilacja wielu bibliotek

Mam go do kompilacji. Oba pliki .so są generowane, ale nie mogę ich użyć w mojej aplikacji. Nie mogę załadować biblioteki przy użyciu System.loadLibrary ("library1.so"); Próbowałem również zapewnić pełną ścieżkę. Ale nie udało się

Również nie mam pojęcia, co napisać w pliku Android.mk folderu macierzystego jni.

Obecna struktura: project_folder -> JNI -> library1 -> JNI -> "kod źródłowy" an Android.mk tu jest napisane project_folder -> JNI -> library2 -> JNI -> "kod źródłowy" Android .mk tu jest napisane

Aktualizacja # 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. 

nie używam Application.mk. To mój 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) 

Odpowiedz

20

najlepszą strukturę znalazłem jest użycie JNI/folder tylko NDK-Makefile zbudować i zachować źródło poza we własnych folderach. Jest to łatwe do dodania do istniejących projektów bez restrukturyzacji twojego drzewa pod jni.

Musisz jednak uważać na to, jak radzisz sobie ze zmienną LOCAL_PATH i używając $ (call my-dir). Oto przykład praca:

  • 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) 

Opcjonalnie można podzielić na sekcje w Android.mk na własną rękę pliki makefile.

+2

Ponadto, przy użyciu LoadLibrary, pominąć „.so” część, na przykład System.loadLibrary ("library1"). – safety

+0

Próbowałem twojej sugestii. Zacząłem od pierwszej biblioteki (zap jest jej nazwą, stąd folder). Ale dostaję błąd kompilacji. Nie wiem, jak opublikować kod w komentarzu. Sprawdź aktualizację nr 1. Dzięki –

+0

Jeśli Android.mk ma numer /jni/Android.mk, to TOP_PATH powinno być ustawione na $ (call my-dir)/.. – safety

0

odkryłem, że podczas kompilacji z wiersza poleceń, mogę zawierać wiele bibliotek, uruchamiając android update project dwa razy, raz z każdej biblioteki:

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 
Powiązane problemy