【发布时间】:2018-07-18 13:58:54
【问题描述】:
我有 Java 函数,声明如下:
public static void mathSendResults(final int kidId, final int points, final int correct, final int error, final float time,
final String date, final long timestamp, final String description,
final String settings, final int classNumber, final int level, final float percentage)
现在,我想通过 JNI 调用这个函数:
void NativeHelper::mathSendResults(int kidId, int points, int correct, int error, float time,
std::string date, long timestamp, std::string description,
std::string settings, int classNumber, int level, float percentage) {
cocos2d::JniMethodInfo t;
if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "mathSendResults",
"(IIIIFLjava/lang/String;JLjava/lang/String;Ljava/lang/String;IIF)V")){
jstring jdate = t.env->NewStringUTF(date.c_str());
jstring jdescription = t.env->NewStringUTF(description.c_str());
jstring jsettings = t.env->NewStringUTF(settings.c_str());
t.env->CallStaticVoidMethod(t.classID, t.methodID, kidId, points, correct, error, time,
jdate, timestamp, jdescription,
jsettings, classNumber, level, percentage);
t.env->DeleteLocalRef(t.classID);
t.env->DeleteLocalRef(jdate);
t.env->DeleteLocalRef(jdescription);
t.env->DeleteLocalRef(jsettings);
}
}
它应该可以工作,但应用程序崩溃并出现以下错误:
JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0x1
这对我来说看起来很奇怪。我试过删除DeleteLocalRef 调用,但它仍然崩溃。我已经有其他方法,但参数较少。我不确定这是否是原因。无论如何,我尝试用整数替换字符串(仅用于测试),因此参数的数量没有改变并且它起作用了。所以这绝对是字符串对象的问题。我也试过发送空字符串,但结果是一样的(所以它与字符串内容无关)。我也尝试将字符串数量减少到只有一个,但它仍然崩溃。
【问题讨论】:
-
你从哪里得到像
t.classID和t.methodID这样的东西? -
这是一个标准的 cocos2d-x JNI 模板。
标签: java android c++ java-native-interface