通过c ++向java发送参数

时间:2013-12-13 07:50:48

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

我的java类有一个静态函数,定义如下:

public static void logEvent(final String eventName, final String jObject) {
        //Function data
    }

现在我的cpp文件具有以下功能

void PingoScreen::callApslarIntegration(){
    char* eventName="bingo";
    JniMethodInfo t;  

if (JniHelper::getStaticMethodInfo(t, "com/myapp/test/ApslarSetup","logEvent", "()V")) {
    t.env->CallStaticVoidMethod(t.classID, t.methodID);
    t.env->DeleteLocalRef(t.classID);
  }
}

如何通过JNI向JAVA函数发送两个字符串参数?

亲切的问候

=============================================== ================

void PingoScreen::callApsIntegration() {

    JniMethodInfo t;

    if (JniHelper::getStaticMethodInfo(t, "com/myapp/test/ApslarSetup",
            "logJSONEvent", "()V")) {

        const char* cstr1 = "Test1";
        const char* cstr2 = "Test2";

        jstring jstr1 = t.env->NewStringUTF(cstr1);
        jstring jstr2 = t.env->NewStringUTF(cstr2);

        t.env->CallStaticVoidMethod(t.classID, t.methodID,jstr1,jstr2);
        t.env->DeleteLocalRef(t.classID);
    }
}

以上功能导致崩溃?

==================================

终于开始工作了

void PingoScreen::callApslarIntegration() {
    JniMethodInfo t;
    if (JniHelper::getStaticMethodInfo
                (t, "com/nbs/test/ApslarSetup",
                "logJSONEvent",
                "(Ljava/lang/String;Ljava/lang/String;)V")) {

        const char* cstr1 = "Test1";
        const char* cstr2 = "Test2";

        jstring jstr1 = t.env->NewStringUTF(cstr1);
        jstring jstr2 = t.env->NewStringUTF(cstr2);

        t.env->CallStaticVoidMethod(t.classID, t.methodID,jstr1,jstr2);
        t.env->DeleteLocalRef(t.classID);
    }
}

崩溃是由于行

if (JniHelper::getStaticMethodInfo
                    (t, "com/nbs/test/ApslarSetup",
                    "logJSONEvent",
                    "(Ljava/lang/String;Ljava/lang/String;)V"))

签名必须是Ljava/lang/String;Ljava/lang/String;而不是Ljava/lang/String;Ljava/lang/String(注意最后的分号)

1 个答案:

答案 0 :(得分:2)

如果您想使用CallStaticVoidMethod,只需将两个jstring传递给它,就像这样:

const char* cstr1 = "Test1";
const char* cstr2 = "Test2";
jstring jstr1 = t.env->NewStringUTF(cstr1);
jstring jstr2 = t.env->NewStringUTF(cstr2);
t.env->CallStaticVoidMethod(t.classID, t.methodID, jstr1, jstr2);

您也可以使用CallStaticVoidMethodACallStaticVoidMethodV代替CallStaticVoidMethod。请参阅documentation here