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

无法使用JNI在androidLollipop中从c向java调用JNI

蒋俊
2023-03-14

我正在制作一个库应用程序,该应用程序使用谷歌断路器检测android中的本机崩溃。每当我的主端发生本机崩溃时,断路器都会调用以下回调。从这个回调中,我需要使用JNI在java类中调用一个静态val方法。

bool breakpad_callback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) {

JNIEnv* env = NULL;

if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK)
{
    if(isDebug)
        LOGI("Failed to get the environment");
    return false;
}

if(isDebug)
    LOGI("attaching thread ...");
vm->AttachCurrentThread(&env, NULL);

if(isDebug)
    LOGI("handle exception");

 ExceptionHandlerClass = (jclass)env->NewGlobalRef(env->FindClass("com/abc/Myclass"));
        if (ExceptionHandlerClass == NULL)
            LOGE("Could not find java class");

 ExceptionHandlerMethod = env->GetStaticMethodID(ExceptionHandlerClass, "handleException", "()V");
        if (ExceptionHandlerMethod == NULL)
            LOGE("Could not bind exception handler method");

// handle exception
env->CallStaticVoidMethod(ExceptionHandlerClass, ExceptionHandlerMethod);

if(env->ExceptionCheck()) {
    LOGI("got exception");
    env->ExceptionDescribe();       
}


if(isDebug)
    LOGI("exception handled");
}

这是我的java方法:

package com.abc;
public class Myclass {
  public static void handleException() {
     System.out.println("inside handle exception");
  }
}

在Android5.0之前,这一功能一直运行良好。但在Lollipop中,我无法调用我的java方法,因为我无法在Logcat控制台上看到“内部句柄异常”日志。

以下是我在logcat上看到的日志消息:

12-01 13:57:46.617: I/AACRNative(1617): attaching thread ...
12-01 13:57:46.617: I/AACRNative(1617): handle exception
12-01 13:57:46.619: I/AACRNative(1617): got exception
12-01 13:57:46.620: W/art(1617): JNI WARNING: java.lang.StackOverflowError thrown while calling printStackTrace
12-01 13:57:46.620: I/AACRNative(1617): exception handled

有人能帮我一下吗?

共有3个答案

赵俊晤
2023-03-14
JNI WARNING: java.lang.StackOverflowError thrown while calling printStackTrace

你的应用程序消耗了太多堆栈。

翟柏
2023-03-14

您可以在“breakpad\u callback”方法中创建一个新线程,然后在该线程中进行JNI调用。它会起作用的。

严景焕
2023-03-14

这是一个已知问题,它提到了一些解决方法,但尚未修复。ART使用替代堆栈进行信号处理,这导致了问题。

 类似资料:
  • 问题内容: 因此,我正在编写一个使用大型c 库的Android应用。我可以正常工作,以便Java应用程序可以调用c 委托方法,但是我发现自己希望自己可以将来自c 的消息记录到Android日志中。从Java上这很容易,但是我不知道如何从c 调用Java方法。我的搜索找到了从c 打开jvm的方法,这根本不是我想要做的。理想情况下,我想将日志方法指针传递给c ,然后可以在需要时使用它。当然,Java不

  • 问题内容: 我尝试在Android NDK上工作,我的第一个测试不是很确定,我需要帮助,因为我看不到错误在哪里。 以下代码可以毫无问题地进行编译,但是当在模拟器上运行时,该程序将返回SIGSEGV信号,并且在logcat中不会显式写入任何错误。但是,将显示一条警告,指出未找到Java类。经过一天的研究,这个问题看起来一切正确。 这是我的Java代码:JNITestActivity.java 这是我

  • 我有一个Java应用程序,它合并了一些大文件。Java应用程序不在我的控制之下。Java应用程序的结果以大约90MB的大字符串返回给我的C程序,我在其中的一些算法中使用它。我多次调用execute方法。我的问题是,每次调用Java应用程序时,它都会保留更多内存,但不会释放内存。从这个垃圾收集和JNI调用问题中,我想到手动调用垃圾收集器,但它不会释放内存。有没有办法解决这个问题? 这是我的C程序

  • 问题内容: 我真的很难弄清楚如何使用JNI从Objective-C调用Java函数。 我首先要说的是,我对Java并不了解很多,但是对Obj- C非常熟悉。我有一个带有单个方法的Java类,需要从我的应用程序包中调用它。该jar位于包中的Resources文件夹内,并且我将其设置为,它被检查并包含2个jar文件的名称(主要是一个,一个依赖)。 我正在通过调用来启动虚拟机,然后尝试使用该类来查找类,

  • 我的C代码无法找到Java中的公共静态函数调用。它成功地找到了类,没有错误。 我试图将结果返回给回调方法。“5”稍后将被更复杂的内容取代。 我在StackOverflow上似乎也有类似的问题,但是到目前为止没有任何变化似乎有所帮助。也许我有逻辑错误? 我的JNI(更新#2): 此代码包含在此函数中调用的方法中: 我的Java(更新#1): 签名检查: javap-s-pcecutils 公共静态响

  • 我是JNI的新手,我正在努力解决这个问题。 我有一个c回调被网络库(alljoyn)调用。 在这个回调中,我需要调用Java代码。 由于此回调位于另一个线程中,因此我使用以下代码获取JNIEnv指针: (jvm是全局指针) 问题是,当我尝试使用此env指针调用FindClass时,结果为NULL。 如果我在主线程中执行完全相同的FindClass调用,一切都会正常工作。 我怎样才能解决这个问题?这