【问题标题】:Call Java function from C++ method从 C++ 方法调用 Java 函数
【发布时间】:2013-06-24 06:56:47
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您的指针未初始化:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-30
        相关资源
        最近更新 更多