java - 如何修复 env->NewObject 上的 JNI 崩溃?

标签 java c++ c java-native-interface clang

我正在尝试通过 JNI (Clang C-API) 使用 Clang。 几次迭代后的一瞬间,它只是停止创建新对象并崩溃:

map method 0 args: create Method instance 0x7fa26ba23c90 0x7fa26ba2a0c0 libclang: crash detected during indexing source file: { 'source_filename' : '/Users/asmirnov/Documents/dev/src/clang_jni/mac/test/TestFile.h'
'command_line_args' : ['-c', '-x', 'c++'], 'unsaved_files' : [],
'options' : 0, }

代码非常简单:

mapMethod(JNIEnv *env, const CXIdxDeclInfo *info) {

    debug("map method");

    int numArgs = clang_Cursor_getNumArguments(info->cursor);
    debug("  %i args:", numArgs);

    debug("create Method instance %p %p", MethodClass, MethodConstructor);
    jobject result = env->NewObject(MethodClass, MethodConstructor);

    debug("create Method  params instance");

方法类和构造函数被找到并正确注册为全局变量(似乎是)并且它工作了几次迭代:

// method
    MethodClass = (jclass)env->NewGlobalRef(env->FindClass("name/antonsmirnov/clang/dto/index/Method"));
    debug(MethodClass != NULL ? "found MethodClass" : "not found MethodClass");

    MethodConstructor = env->GetMethodID(MethodClass, "<init>", "()V");
    debug(MethodConstructor != NULL ? "found MethodConstructor" : "not found MethodConstructor");

我读过一些“jni 提示和技巧”文章并尝试env->DeleteLocalRef 并使本地引用计数太大而无法尝试,但没有结果:

// magic 
    jint ensureResult = env->EnsureLocalCapacity(1024);
    debug("ensure result %i", ensureResult);

    jint pushResult = env->PushLocalFrame(1024);
    debug("push result %i", pushResult);

Clang 正在劫持异常,所以我看不出真正的原因。 正如我所说,这个问题在几次迭代后发生,所以它似乎是一些超出限制的问题或 smth。

怎么了?

更新:我做了一些研究,我发现如果我之前删除一些本地变量,我可以获得更多的迭代和一个对象实例。所以它让我觉得它确实使用了 16 个本地变量并忽略了我的 EnsureLocalCapacity 调用。应该在哪里做?

最佳答案

JNI_OnLoad() 中使用 EnsureLocalCapacity 进行了修复(在每个 native 方法调用中都不起作用)。

关于java - 如何修复 env->NewObject 上的 JNI 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19887763/

相关文章:

java - Android Studio 'Clean Project' 不工作

java - 使用 Java 连接到 mySQL 数据库

c++ - 将 C 类型字符串数组中的元素作为 BSTR 传递给 COM 对象? (在 C++ 中)

c++ - 无法理解 C 中字符串和循环的这种意外行为

java - Hibernate 3.3 继承@IdClass 中的@DiscriminatorColumn

java - 如何动态指定JMX端口号

c++ - 指向槽函数的指针

c++ - GCC 可以配置为忽略#pragma 指令吗?

c++ - boost::shared_ptr 没有类类型

c++ - 输出 float 进行调试