尝试在c ++

时间:2015-07-06 19:36:54

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

我目前正在编写一款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

如果数组是自己的元素,那么数组并不想接受它,因为它是一个不同的类型,这没有多大意义,所以很明显我是遗失了什么。

非常感谢任何帮助!

0 个答案:

没有答案
相关问题