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

例として、 C からの JVM の作成 を確認してください。JVM を作成してメソッドを呼び出すサンプル手順を示します。JVM がすでに存在する場合。たとえば、C プログラムが Java プログラムによって呼び出された場合 (コールバックの状況)、JNIEnv* ポインターをキャッシュできます。

アドバイスとして、C/C++ から JVM へのポインタをキャッシュする際には注意してください。何をキャッシュできるかについてはセマンティクスが関係しており、後で呼び出すことができます。

ソース: C++ から Java 関数を呼び出すには?

于 2013-06-24T07:04:24.353 に答える