2012-08-03 68 views
7

我已收到過去一天左右的消息,直到現在它並沒有造成問題。我得到我的代碼與我的本地庫運行較早,但今天我添加了一些新的功能,並再次無法正常工作。沒有JNI_OnLoad發現在...跳過init

LogCat中沒有顯示錯誤,但我的程序只是在我的設備上立即打開和關閉。沒有消息表示應用程序意外停止,只是屏幕上出現黑色閃光。

我環顧了谷歌和SO,但有這麼多不同的原因,這個消息出來。這是我的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' 

我想知道的是:

1)這是No JNI_OnLoad消息引起我的程序不開? 2)如果是這樣,我知道我沒有發佈我的代碼,但有人可以解釋此消息的一般想法。包括它跳過的東西init

編輯:

我今天添加的新功能在發生這種情況時被註釋掉。最初我得到了一個不同的錯誤,並想確保我的舊代碼仍然有效。

回答

13

函數JNI_OnLoad不是必需的。因此,如果你沒有提供這個功能,你的程序應該正常運行。

您的問題來自您的代碼的另一部分。嘗試使用ndk-gdb來修復它。

+0

謝謝,用ndk-gdb找到了一些東西。 – JuiCe 2012-08-03 15:10:14

0

這裏作爲@djedge提到JNI_OnLoad只是一個警告。這很可能有兩個主要原因。 第一個是你的Android.mk文件有問題。正常情況下應該是像

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) 

在這裏,請給出一些LOCAL_SRC_FILES注意是否提供正確的C/C++源文件。

巢問題將在於你的功能簽名。如果你生成頭文件,那些函數簽名應該與你的c/C++文件函數/方法定義匹配。

這裏是一個例子。 頭文件

JNIEXPORT jlong JNICALL Java_com_example_jobs_myapplication_DetectionBasedTracker_nativeCreateObject 

(JNIEnv的*,JCLASS,的jstring,jint);

C++文件

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

    //code goes here... 
    } 

這裏com_example_jobs_myapplication可能是錯的。