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

时间:2012-08-03 14:49:09

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

过去一天左右我收到了这条消息,直到现在它还没有引起问题。我让我的代码早先与我的本机库一起运行,但今天我添加了一些新功能,但它再次无效。

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

我已经浏览了谷歌和搜索引擎优化,但这个消息有很多不同的原因。这是我的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

编辑:

我今天添加的新功能在发生这种情况时被注释掉了。我最初得到了一个不同的错误,并希望确保我的旧代码仍在运行。

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分: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 ++源文件。

Nest问题将出现在您的函数签名中。如果您生成了头文件,那些函数签名应该与您的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 可能有误。