在 ... 中找不到 JNI_OnLoad,跳过初始化。

8
我最近一天左右一直收到这个信息,但直到现在它还没有引起问题。我之前已经用本地库运行了我的代码,但今天我添加了几个新功能,又无法正常工作。
在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)这个“无JNI_OnLoad”消息是否导致我的程序无法打开? 2)如果是这样,我知道我没有发布我的任何代码,但是否有人可以解释一下这个消息的一般思路。包括它跳过哪个“init”。
编辑: 今天我添加的新功能在出现这种情况时被注释了。最初我遇到了不同的错误,并希望确保我的旧代码仍然可以工作。
2个回答

13

JNI_OnLoad 函数不是必要的。因此,如果您没有提供此函数,您的程序应该正常运行。

您的问题来自代码的另一部分。尝试使用 ndk-gdb 解决它。


谢谢,用ndk-gdb找到了一些问题。 - JuiCe

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 可能是错误的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接