2012-08-03 70 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可能是错的。