我的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
(注意最后的分号)
答案 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);
您也可以使用CallStaticVoidMethodA
或CallStaticVoidMethodV
代替CallStaticVoidMethod
。请参阅documentation here。