我目前正在编写一款Android游戏,部分AI需要克隆和洗牌很多次。我试图将此操作带到本机层,看看这是否会带来任何性能提升。我将对象数组保存为Java类中的字段,并在JNI层中访问它。 我对JNI和原生编程都很陌生,所以我已经陷入困境了。 这是.cpp文件中的一些相关JNI代码:
JNIEXPORT void JNICALL Java_com_my_class_MyArrayClass_shuffleArray (JNIEnv *env, jobject obj){
jfieldID objectArrayID;
jfieldID objectArraySizeID;
jobject objectArrayObject;
jobjectArray objectArray;
int objectArraySize;
/* Get a reference to obj’s class */
jclass cls = env->GetObjectClass(obj);
/* Look for the instance fields in cls */
objectArrayID = env->GetFieldID(cls, "objectArray","[Lcom/my/class/MyClass;");
objectArraySizeID = env->GetFieldID(cls, "objectArraySize", "I");
/* Read the instance fields */
objectArrayObject = env->GetObjectField(obj, objectArrayID);
objectArraySize= env->GetIntField(obj, objectArraySizeID);
/* Cast objectArray Object to jobjectArray */
objectArray = reinterpret_cast<jobjectArray>(&objectArrayObject);
/* Implementing Fisher–Yates shuffle */
for (int i = objectArraySize- 1; i > 0; i-- ) {
int index = rand() % i + 1;
jobject tempObj = env->GetObjectArrayElement(objectArray, index);
jobject tempObj2 = env->GetObjectArrayElement(objectArray, i);
env->SetObjectArrayElement(objectArray, i, tempObj);
env->SetObjectArrayElement(objectArray, index, tempObj2);
}
env->SetObjectField(obj, objectArrayID, objectArrayObject);
}
代码编译正常且没有错误,但在调用本机方法时,我得到以下异常:
E/AndroidRuntime(31021): java.lang.ArrayStoreException: (ƓB cannot be stored in an array of type ߒB
如果数组是自己的元素,那么数组并不想接受它,因为它是一个不同的类型,这没有多大意义,所以很明显我是遗失了什么。
非常感谢任何帮助!