Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 导致VM崩溃的JNI本机方法_Java_C++_Function_Java Native Interface - Fatal编程技术网

Java 导致VM崩溃的JNI本机方法

Java 导致VM崩溃的JNI本机方法,java,c++,function,java-native-interface,Java,C++,Function,Java Native Interface,我正在用C++ JNIEXPORT jobjectArray JNICALL myMethod(JNIEnv *env, jclass, //parameters){ int** result = //my function to obtain a matrix n x m of integers std::vector<jint> tmp; //fill the vector tmp with matrix integers and deallocate

我正在用C++

JNIEXPORT jobjectArray JNICALL myMethod(JNIEnv *env, jclass, //parameters){

    int** result = //my function to obtain a matrix n x m of integers
    std::vector<jint> tmp;

    //fill the vector tmp with matrix integers and deallocate the matrix
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            tmp[m*i + j] = result[i][j];
        }
        free(result[i]);
    }
    free(result);

    jintArray jResults = env->NewIntArray( tmp.size() );
    env->SetIntArrayRegion( jResults, 0, tmp.size(), &tmp[0] );
    return env->NewObjectArray(tmp.size(), env->GetObjectClass(jResults), 0);
}

你知道吗?

你从来没有初始化过
result
变量,因此你的代码最终尝试从垃圾地址读取,然后尝试释放它从垃圾地址读取的指针


(哦,没关系,有隐藏的代码…

我写这篇文章时,您当前的代码是:

JNIEXPORT jobjectArray JNICALL myMethod(JNIEnv *env, jclass, //parameters){

    int** result = //my function to obtain a matrix n x m of integers
    std::vector<jint> tmp;

    //fill the vector tmp with matrix integers and deallocate the matrix
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            tmp[m*i + j] = result[i][j];
        }
        free(result[i]);
    }
    free(result);

    jintArray jResults = env->NewIntArray( tmp.size() );
    env->SetIntArrayRegion( jResults, 0, tmp.size(), &tmp[0] );
    return env->NewObjectArray(tmp.size(), env->GetObjectClass(jResults), 0);
}

干杯&hth.,

我怀疑是否可以将int[]作为对象数组返回。尤其是
env->GetObjectClass(jResults)
这一行对我来说似乎很可疑。此行试图获取int[]的类,据我所知,int[]是不存在的。我的建议是要么返回一个整数[],然后使用env->GetObjectClass(“java/lang/Integer”)获取该类,或将方法签名更改为jintArray。据我所知,jintArray!=jobjectArray。

您可以尝试使用Java VM选项-Xcheck:jni。详细信息可在中找到。

我从返回
int**
的函数中获取该变量的值。您在问题中引用的代码中没有进行此类获取。(啊,有没有什么有趣的东西被替换成了评论?那么我们应该如何帮助你呢?)我用一个注释替换了这个函数,因为我的问题与这个函数无关。这个函数只返回一个
int**
,它工作得很好。嘿,伙计,你想要整个项目吗?这个函数非常复杂,我无法将它粘贴到这里……如果你想帮我解决这个问题,你不需要它,因为它可以工作,因为我需要它函数的Java声明是什么?它是否应该返回一个满是null的int[][](因为这是您在return语句中创建的)?谢谢:)我是一个新的C++开发者,我现在主要是java开发者。最后我从java方面得到了一个结果,但是它是空的!我认为返回命令在我做JNI的时候已经有十多年的错误了,但是我从代码中看到的印象是,<代码>返回< /Cord>表达式创建了所有空值的数组,并且你应该相反,return
jResults
:-)很抱歉上次的评论,看看返回类型,我的印象似乎是错误的。但不知何故,您需要将这些值传递给返回的数组对象。
JNIEXPORT jobjectArray JNICALL myMethod(JNIEnv *env, jclass, //parameters){

    int** result = //my function to obtain a matrix n x m of integers
    std::vector<jint> tmp;

    //fill the vector tmp with matrix integers and deallocate the matrix
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            tmp[m*i + j] = result[i][j];
        }
        free(result[i]);
    }
    free(result);

    jintArray jResults = env->NewIntArray( tmp.size() );
    env->SetIntArrayRegion( jResults, 0, tmp.size(), &tmp[0] );
    return env->NewObjectArray(tmp.size(), env->GetObjectClass(jResults), 0);
}
std::vector<jint> tmp( m*n );