2014-07-21 12 views
8

W moim projekcie Android, przy użyciu najnowszych narzędzi do kompilacji Gradle, mam pojedynczy plik z natywnym kodem C i kilkoma prostymi funkcjami. Jedyną rzeczą zawartą w pliku C jest string.h i jni.h, a funkcje po prostu zwracają łańcuch i prymitywy. Plik znajduje się w katalogu jni oprócz innych folderów źródłowych (java, res itd.).Symbole są usuwane podczas budowania kodu natywnego przy użyciu Gradle

Kiedy buduję aplikację, kompiluje kod C, generuje plik .so i umieszcza go w moim pliku APK. Problem polega na tym, że plik .so ma obnażone WSZYSTKIE symbole.

Podczas sprawdzania pośredniego pliku .so umieszczonego w katalogu build/intermediate/ndk/obj, wszystkie symbole nadal istnieją. Więc gdzieś po wygenerowaniu pierwszego pliku .so i gdy zostanie spakowany, wszystko zostaje usunięte.

Podczas budowania pliku .so za pomocą wiersza poleceń ndk-build wszystko działa poprawnie, a symbole są dołączone.

Czy to błąd w pluginach systemu Android Gradle (używam najnowszego!) Czy czegoś brakuje?

+0

Którą wersję NDK używasz? –

+0

Próbowano zarówno r9d, jak i r10. Ten sam wynik. –

Odpowiedz

0

Upewnij się, że używasz makr JNIEXPORT i JNICALL w swoich metodach. Upewnij się także, że proguard nie usuwa najpierw klasy, która tylko wywołuje rzeczy jni - a później sam kod JNI, ponieważ żadna klasa go nie używa.

https://developer.android.com/tools/help/proguard.html#configuring

Przykład JNIEXPORT I JNICALL

JNIEXPORT jint JNICALL foobar(JNIEnv* env, jclass cls) { 
    return 0; 
} 
1

Symbole są: src/main/obj/lokalny więc dodanie build.grade:

android.sources { 
    main { 
     jni { 
      source { 
       srcDir 'src/main/none' 
      } 
     } 
     jniLibs { 
      source { 
       srcDir 'src/main/obj/local' 
      } 
     } 
    } 
} 

a następnie przejść do debugowania konfiguracja> Debugger i dodać do katalogów Symbol: app/build/półproduktów/jniLibs

potem byłem w stanie do debugowania mojego kodu macierzystego.

Powiązane problemy