从C ++方法调用Java函数

时间:2013-06-24 06:56:47

标签: java android c++ java-native-interface

我在使用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初始化为什么。

2 个答案:

答案 0 :(得分:3)

您的指针未初始化:

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

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

答案 1 :(得分:3)

例如,选中Creating a JVM from C。它显示了创建JVM并调用方法的示例过程。如果JVM已经存在;例如你的C程序是由Java程序调用的(回调情况),你可以缓存JNIEnv *指针。

作为建议,请注意从C / C ++缓存指向JVM的指针,关于可以缓存的内容涉及一些语义,以后可以调用它。

来源:How to call Java functions from C++?