如何在jni字段中设置Java floatArray

如何在jni字段中设置Java floatArray,java,android,java-native-interface,Java,Android,Java Native Interface,在Java领域 public class JNI{ static{ System.loadLibrary("jni");} public float dataArray[] = new float[5]; public float data; } Java_example_JNI_setData(JNEEnv *env, jobject instance){ jclass jclass1 = (*env).GetObjectClass(instance);

在Java领域

public class JNI{
    static{ System.loadLibrary("jni");}
    public float dataArray[] = new float[5];
    public float data;
}
<

JNI C++域< /P>

Java_example_JNI_setData(JNEEnv *env, jobject instance){
    jclass jclass1 = (*env).GetObjectClass(instance);
    jfieldID jfieldID1 = (*env).GetFieldID(jclass1, "data", "F");
    jfloat var1 = 1.0f;
    (*env).setFloatField(instance, jfieldID1, var1);
    float var[5] = {1.f, 2.f, 3.f, 4.f, 5.f};
}
//如何将dataArray设置为var?
//或者如何使用“SetFloatArrayRegion”不返回值。

float
是java基本类型,其依赖于机器的本机类型是
jfloat

所以您需要将
float
映射为java类中的
jfloat
,该类实现了本机方法


您可以使用以下方法:

JNIEXPORT void JNICALL Java_recipeNo013_PassArrayBack_passFloatArray
  (JNIEnv *env, jclass obj, jfloatArray array) {

  /* get size of the array */
  jsize len = (*env)->GetArrayLength(env, array);

  /* get the body of array; it will be referecende by C pointer */
  jfloat *body = (*env)->GetFloatArrayElements(env, array, 0);

  /* do some stuff */
  for(int i=0; i < len; i++) {
    printf("Float value: %f\n", body[i]);

    /* update value */
    body[i] = 0;
  }

  /* release body when you decide it is no longer needed
    Do not pass changes back to Java */
  (*env)->ReleaseFloatArrayElements(env, array, body, JNI_ABORT);
}
JNIEXPORT void JNICALL Java\u recipeNo013\u PassArrayBack\u passFloatArray
(JNIEnv*env、jclass obj、jfloatArray数组){
/*获取数组的大小*/
jsize len=(*env)->GetArrayLength(env,数组);
/*获取数组体;它将被C指针引用*/
jfloat*body=(*env)->GetFloatArrayElements(env,数组,0);
/*做点什么*/
对于(int i=0;iReleaseFloatArrayElements(环境、数组、主体、JNI_中止);
}
更多信息可在此处找到:

关于访问从Java传递到C的对象字段,您可以在此处找到一些信息: