2012-08-03 3 views
7

Otrzymuję tę wiadomość od poprzedniego dnia i do tej pory nie spowodowało problemu. Dostałem mój kod do uruchomienia z moją rodzinną biblioteką wcześniej, ale dzisiaj dodałem kilka nowych funkcji i znowu to nie zadziała.Nie znaleziono JNI_OnLoad w ... pomijam init

W LogCat nie ma żadnych błędów, ale mój program po prostu otwiera się i zamyka natychmiast na moim urządzeniu. Nie ma komunikatu informującego, że aplikacja niespodziewanie się zatrzymała, po prostu czarny błysk na ekranie.

Rozejrzałem się po Google i SO, ale jest tyle różnych powodów, dla których ta wiadomość pojawiła się. Oto moja LogCat:

08-03 10:44:50.186: D/dalvikvm(2143): Trying to load lib /data/data/my.eti.commander/lib/libRelayAPI.so 0x40514f58 
08-03 10:44:50.186: D/dalvikvm(2143): Added shared lib /data/data/my.eti.commander/lib/libRelayAPI.so 0x40514f58 
08-03 10:44:50.186: D/dalvikvm(2143): No JNI_OnLoad found in /data/data/my.eti.commander/lib/libRelayAPI.so 0x40514f58, skipping init 
08-03 10:44:50.288: I/DEBUG(1058): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
08-03 10:44:50.288: I/DEBUG(1058): Build fingerprint: 'LENOVO/IdeaPad_Tablet_A1_07/A1_07:2.3.4/GRJ22/eng.user.20120209.100319:user/release-keys' 

Co chciałbym wiedzieć:

1) Czy to No JNI_OnLoad wiadomość powodując mój program nie otworzy?

2) Jeśli tak, to wiem, że nie mam żadnego kodu opublikowanego, ale czy ktoś mógłby wyjaśnić ogólną ideę tej wiadomości. Włączając to, co przeskakuje.

EDIT:

Nowe funkcje ja dzisiaj dodane komentowano, kiedy to się stało. Pierwotnie dostałem inny błąd i chciałem się upewnić, że mój stary kod nadal działa.

Odpowiedz

13

Funkcja JNI_OnLoad nie jest niezbędna. Tak więc, jeśli nie masz tej funkcji, Twój program powinien działać normalnie.

Twój problem pochodzi z innej części kodu. Spróbuj użyć ndk-gdb, aby to naprawić.

+0

Dzięki, znalazłem kilka rzeczy z ndk-gdb. – JuiCe

0

Tutaj jako @djedge wymienione JNI_OnLoad jest tylko ostrzeżenie. Prawdopodobnie istnieją dwa główne powody. Po pierwsze coś jest nie tak z plikiem Android.mk. Normalnie powinno być wyglądać

LOCAL_PATH := $(call my-dir) 
    include $(CLEAR_VARS) 
    OPENCV_CAMERA_MODULES:=on 
    OPENCV_INSTALL_MODULES:=on 
    #OPENCV_LIB_TYPE:=SHARED 
    include D:\NDK\MyApplication3\libraries\native\jni\OpenCV.mk 
    LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp 
    LOCAL_C_INCLUDES += $(LOCAL_PATH) 
    LOCAL_LDLIBS  += -llog -ldl 
    LOCAL_MODULE  := detection_based_tracker 
    include $(BUILD_SHARED_LIBRARY) 

tu proszę dać pewną uwagę na LOCAL_SRC_FILES czy poprawny plik c/C++ źródłowy jest dostępny.

Problem z gniazdem leży w podpisach funkcji. Jeśli wygenerowałeś pliki nagłówkowe i te sygnatury funkcji powinny być zgodne z definicjami funkcji/metod pliku c/C++.

Oto przykład. nagłówka pliku

JNIEXPORT jlong JNICALL Java_com_example_jobs_myapplication_DetectionBasedTracker_nativeCreateObject 

(JNIEnv * JClass, jstring, jint);

C++ plik

JNIEXPORT jlong JNICALL Java_com_example_jobs_myapplication_DetectionBasedTracker_nativeCreateObject 
(JNIEnv * jenv, jclass, jstring jFileName, jint faceSize) 
    { 

    //code goes here... 
    } 

Tutaj com_example_jobs_myapplication może być źle.