2013-06-24 114 views
2

我正面臨從C++方法調用Java函數的麻煩。以下是我在做什麼從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到的是什麼。

回答

3

作爲示例,請檢查Creating a JVM from C。它顯示了創建JVM並調用方法的示例過程。如果JVM已經存在;例如你的C程序被Java程序調用(回調情況),你可以緩存JNIEnv *指針。

作爲一個建議,要小心從C/C++緩存指向JVM的指針,還有一些語義涉及你可以緩存什麼,以後可以調用它。

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

3

您的指針沒有初始化:

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

您必須使用JNIEnv指針,如果你希望能夠與您的Java代碼來傳達你從JNI調用得到。