当前位置: 首页 > 知识库问答 >
问题:

Android JNI在应用程序中检测到错误:调用JNI GetMethodID时出现挂起的异常

李森
2023-03-14

我正试着用我的android项目运行一个谷歌OCR Tesseract。我已经使用android ndk遵守了tesseract,在我尝试运行android项目后收到了这个错误。

我的环境如下

  • Android5.1.1

作为参考,我从这里列出的示例构建示例链接

提前感谢!

下面是我的logcat结果的一个片段:

  I/DEBUG   (  182): Revision: '0'
    I/DEBUG   (  182): ABI: 'arm'
    I/DEBUG   (  182): pid: 20291, tid: 20337, name: JavaBridge  >>> com.enterprisem
    obility.OCR <<<
    I/DEBUG   (  182): signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
    I/DEBUG   (  182): Abort message: 'art/runtime/check_jni.cc:65] JNI DETECTED ERR
    OR IN APPLICATION: JNI GetMethodID called with pending exception 'java.lang.NoSu
    chFieldError' thrown in void com.googlecode.tesseract.android.TessBaseAPI.native
    ClassInit():-2'
    I/DEBUG   (  182):     r0 00000000  r1 00004f71  r2 00000006  r3 00000000
    I/DEBUG   (  182):     r4 a0701db8  r5 00000006  r6 0000000b  r7 0000010c
    I/DEBUG   (  182):     r8 00000000  r9 b486f520  sl a1c0ac00  fp 00000001
    I/DEBUG   (  182):     ip 00004f71  sp a07006d8  lr b6e503c5  pc b6e72f6c  cpsr
    60070010
    I/DEBUG   (  182):
    I/DEBUG   (  182): backtrace:
    I/DEBUG   (  182):     #00 pc 00039f6c  /system/lib/libc.so (tgkill+12)
    I/DEBUG   (  182):     #01 pc 000173c1  /system/lib/libc.so (pthread_kill+52)
    I/DEBUG   (  182):     #02 pc 00017fd3  /system/lib/libc.so (raise+10)
    I/DEBUG   (  182):     #03 pc 00014795  /system/lib/libc.so (__libc_android_abor
    t+36)
    I/DEBUG   (  182):     #04 pc 00012f44  /system/lib/libc.so (abort+4)
    I/DEBUG   (  182):     #05 pc 00228cd7  /system/lib/libart.so (art::Runtime::Abo
    rt()+170)
    I/DEBUG   (  182):     #06 pc 000a7371  /system/lib/libart.so (art::LogMessage::
    ~LogMessage()+1360)
    I/DEBUG   (  182):     #07 pc 000b1b17  /system/lib/libart.so (art::JniAbort(cha
    r const*, char const*)+1118)
    I/DEBUG   (  182):     #08 pc 000b2055  /system/lib/libart.so (art::JniAbortF(ch
    ar const*, char const*, ...)+68)
    I/DEBUG   (  182):     #09 pc 000b530f  /system/lib/libart.so (art::ScopedCheck:
    :ScopedCheck(_JNIEnv*, int, char const*)+1346)
    I/DEBUG   (  182):     #10 pc 000b7755  /system/lib/libart.so (art::CheckJNI::Ge
    tMethodID(_JNIEnv*, _jclass*, char const*, char const*)+36)
    I/DEBUG   (  182):     #11 pc 001332f7  /data/app/com.enterprisemobility.OCR-1/l
    ib/arm/libtess.so (Java_com_googlecode_tesseract_android_TessBaseAPI_nativeClass
    Init+46)
    I/DEBUG   (  182):     #12 pc 0000614d  /data/dalvik-cache/arm/data@app@com.ente
    rprisemobility.OCR-1@base.apk@classes.dex
    W/ActivityManager(  536):   Force finishing activity 1 com.enterprisemobility.OC
    R/.MainActivity
    I/DEBUG   (  182):
    I/DEBUG   (  182): Tombstone written to: /data/tombstones/tombstone_07

共有3个答案

钱峻
2023-03-14

您应该使用android ndk中的ndk堆栈工具来找出崩溃的位置。请参阅关于ndk堆栈的链接。

adb logcat > /tmp/foo.txt

$NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump foo.txt
亢雅懿
2023-03-14

我也有同样的问题,这让我困惑了两天。最后一个原因是我传递了错误的对象类型。例如,java代码是

public OverlayLine(int mWidth,List<GeoPoint> mPoints);

我注册jni方法如下:

gClass.mInitMethod = env->GetMethodID(gObject, "<init>", "(ILjava/lang/Object;)V");

并在遇到Errol时获取错误消息。我修复了代码

gClass.mInitMethod = env->GetMethodID(gObject, "<init>", "(ILjava/util/List;)V");

错误消失了。您应该传递精确的对象类型,而不是“Ljava/lang/object;”。

燕鸿波
2023-03-14

中止消息相对清晰:您调用GetFieldID(cls,fieldName),以获取传递给该函数的类中不存在的字段名,但不检查该错误,并继续调用其他JNI函数。不幸的是,你不能忽视这些错误。在调用GetMethodID()或大多数JNI函数之前,必须先调用ExceptionClear()。

您可以使用addr2line查找对getmetodID()的哪个特定调用崩溃,并在此基础上导出对GetFieldID(cls, field dName)的哪个调用失败。但我建议为您的所有JNI调用添加错误检查,因为明天其他一些函数可能会引发异常。

 类似资料: