2012-09-27 13 views
14

Ludzie,Nie JNI_OnLoad znaleźć omijając INIT> Shutdown Application

Pracuję nad android aplikacji gdzie potrzebne osobie trzeciej .so biblioteki. Zbudowałem tej biblioteki stron trzecich (z ndk-build) zgodnie z ich instrukcjami, a następnie szukałem , aby dołączyć to .so do mojego projektu Android.

Dlatego wykonałem kroki opisane w dokumentacji/PREBUILTS.html i pomyślnie zbudowałem nowe .so w katalogu jni/prefabrykowanym. Teraz próbowałem wykorzystać możliwości .so, używając go w prostej testowej aplikacji na Androida. Więc co mam zrobić, to:

static { 
    Log.i("load so > ","load so"); 
    System.loadLibrary("xyz"); 
    } 
/* The native functions */ 
private static native int openFile(String filename); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try{ 
     String path = getPathForDownloadDirectoryFile(); 
     Log.i("file path> ", path); 
     int num= openFile(path); 
    }catch(Exception e){ 
     Log.e(">", "could not open the file"); 
    } 
} 

Teraz, gdy uruchomię mojej aplikacji pojawia się komunikat debugowania mówiąc: Nie JNI_OnLoad znaleźć w /data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738, omijając init , a następnie aplikacja zostanie zamknięta.

Aby uzyskać więcej informacji, Oto dziennik błędów:

No JNI_OnLoad found in /data/data/com.example.mysecondapp/lib/xyz.so 0x411e67a0, skipping init 
W/dalvikvm( 570): No implementation found for native Lcom/example/mysecondapp/MainActivity;.openFile:(Ljava/lang/String;)I 
D/AndroidRuntime( 570): Shutting down VM 
W/dalvikvm( 570): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
E/AndroidRuntime( 570): FATAL EXCEPTION: main 
E/AndroidRuntime( 570): java.lang.UnsatisfiedLinkError: Native method not found: com.example.mysecondapp.MainActivity.openFile:(Ljava/lang/String;)I 
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.openFile(Native Method) 
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.onCreate(MainActivity.java:31) 
E/AndroidRuntime( 570): at android.app.Activity.performCreate(Activity.java:5008) 
E/AndroidRuntime( 570): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
E/AndroidRuntime( 570): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
E/AndroidRuntime( 570): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
E/AndroidRuntime( 570): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
E/AndroidRuntime( 570): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
E/AndroidRuntime( 570): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 570): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime( 570): at android.app.ActivityThread.main(ActivityThread.java:4745) 
E/AndroidRuntime( 570): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime( 570): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
E/AndroidRuntime( 570): at dalvik.system.NativeStart.main(Native Method) 
W/ActivityManager( 146): Force finishing activity com.example.mysecondapp/.MainActivity 

Ponieważ widziałem, że natywna implementacja dla openFile() Metoda nie został znaleziony, ale ten sam xyz.so lib pracował całkiem miłe z oryginałem przykładowa aplikacja od strony trzeciej. Jestem prawie początkującym światem Android-ndk.

Java-Android-NDK Ninja ... nie wiecie, czego może mi brakować? Gorąco dziękuję za każdą pomoc :)

Odpowiedz

16

Jako, że guycole powiedział "Brak JNI_OnLoad" jest tylko ostrzeżeniem, twój problem leży gdzie indziej.

Jak wspomniano pomyślnie skompilowany swoje „Tak” plik, problem może leżeć w swoich podpisów funkcyjnych wewnątrz C/C++ kod powinien to być coś takiego

JNIEXPORT jint JNICALL Java_com_your_package_class_method(JNIEnv *d, jobject e, jstring f) 
{ 
//some action 

} 

Podpisy funkcyjne pochodzi plik nagłówkowy, który jest generowany przy użyciu narzędzia java. Musisz wygenerować plik nagłówkowy i użyć podpisu funkcji wraz z nazwą pakietu. W przypadku różnych nazw pakietów i klas plik nagłówkowy i odpowiedni podpis funkcji ulegną zmianie.

worked pretty neat with the original sample app from the third party 

To może być powód, dla którego działa w przykładowej aplikacji, a nie w aplikacji.

patrz: https://thenewcircle.com/s/post/49/using_ndk_to_call_c_code_from_android_apps

+0

w prawo! nazwa paczki może być powodem! Pozwól, że wypróbuję to z odpowiednim opakowaniem. Wrócę do ciebie, dzięki! –

+0

Buduję .so z nową strukturą pakietu, która jest moją własnością, ale teraz dostaję błąd [INSTALL_FAILED_MISSING_SHARED] podczas instalacji apk na urządzeniu pomimo faktu, że xyz.so występuje w folderze Project_folder/libs/arm_folder. Masz pojęcie, co może być za tym wszystkim? –

+0

wklej swój plik make, a także spróbuj uruchomić przykład podany w linku, otrzymasz trochę jasności. –

6

Komunikat "Brak JNI_OnLoad" jest tylko ostrzeżeniem. JNI_OnLoad jest opcjonalnym hakiem inicjującym.

Zgaduję, że twój problem jest wewnątrz metody openFile(). Spróbuj skomentować połączenie z Java i sprawdź, jak daleko się dostajesz.

Mam wpis na blogu o JNI i przykładowy kod pod adresem http://guycole.blogspot.com/2012/03/yet-another-android-ndk-blog-posting.html - może okaże się to przydatne.

Powodzenia.

+0

Dzięki guycole! Twój artykuł jest naprawdę obszerny. –

+0

Dokładnie. Twój wpis na blogu też jest dobrze zrobiony. Miły dotyk dostarczający kod źródłowy dla wywołań JNI w Javie. –

2

To również pochodzi z tego dziennika

??-?? ??:??:??.???: INFO/(): java.lang.UnsatisfiedLinkError: Couldn't load *: findLibrary returned null

prawo ??

Myślę, że to jest problem plików android.mk. 1: spróbuj swith, aby uzbroić v7. 2: loadciton wywoła funkcję open(). sprawdź pozwolenie na to.

0

Jak wspomniano w poprzednich odpowiedziach, brak JNI_OnLoad jest tylko ostrzeżeniem.

Miałem podobny problem, doszedłem do wniosku, że problem dotyczy operacji na plikach.

Moja aplikacja nie było konieczności zewnętrznego przechowywania zapisu permission.After dodając poniższy kod w manifest to działa dobrze

Powiązane problemy