2

我在从 C++ 方法调用 Java 函数时遇到了麻烦。以下是我正在做的

我的java类

package com.q.IT;

public class Carv {

public boolean isValidRatio(float a, float b)
{

       //do something
       return True;
    }
}

我的 C++ 方法

void printAndValidateResults() {

    JNIEnv *env;
jclass ItClass =env->FindClass("com/q/IT/Carv");
jobject object = env->AllocObject(ItClass);
jmethodID isValidRatioID = env->GetMethodID(ItClass,"isValidRatio", "(FF)Z");
    bool retVal = env->CallBooleanMethod(object, isValidRatioID, 1.0f,2.0f);
}

我收到以下错误

06-23 23:35:03.459: A/libc(15758): Fatal signal 11 (SIGSEGV) at 0xe92d43a4 (code=1), thread 16113 (AsyncTask #2)

如您所见,C++ 方法是普通的 C++ 方法,而不是类似

JNIEXPORT void JNICALL Java_com_q_IT_blahblah(JNIEnv *, jobject) {

,我想保持这种状态。崩溃发生在这里

jclass ItClass =env->FindClass("com/q/IT/Carv");

我不太确定将 *env 初始化为什么。

4

2 回答 2

3

您的指针未初始化:

JNIEnv *env;
jclass ItClass =env->FindClass("com/q/IT/Carv"); // env has not been set

JNIEnv如果您希望能够与 Java 代码进行通信,则必须使用从 JNI 调用中获得的指针。

于 2013-06-24T07:02:32.113 回答
3

例如,检查从 C 创建 JVM。它显示了创建 JVM 和调用方法的示例过程。如果JVM已经存在;例如,您的 C 程序被 Java 程序调用(回调情况),您可以缓存 JNIEnv* 指针。

作为建议,请小心从 C/C++ 缓存指向 JVM 的指针,其中涉及到一些关于您可以缓存哪些内容以及稍后可以调用它的语义。

资料来源:如何从 C++ 调用 Java 函数?

于 2013-06-24T07:04:24.353 回答