【问题标题】:No JNI_OnLoad found in ... skipping init在 ... 中未找到 JNI_OnLoad 正在跳过初始化
【发布时间】:2012-08-03 14:49:08
【问题描述】:

我在过去一天左右一直收到此消息,直到现在它还没有造成问题。我早些时候让我的代码与我的本机库一起运行,但今天我添加了一些新函数,但它再次不起作用。

LogCat 中没有显示错误,但我的程序只是在我的设备上立即打开和关闭。没有消息说应用程序已意外停止,只是屏幕上出现黑色闪烁。

我查看了 google 和 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 它正在跳过的内容。

编辑:

我今天添加的新功能在发生这种情况时被注释掉了。我最初遇到了另一个错误,并想确保我的旧代码仍然有效。

【问题讨论】:

    标签: android android-ndk java-native-interface


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,用 ndk-gdb 找到了一些东西。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多