如何在jni字段中设置Java floatArray

时间:2017-01-09 04:22:31

标签: java android java-native-interface

在Java领域

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

在JNI c ++字段中

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”不返回值。

2 个答案:

答案 0 :(得分:0)

float是java原始类型,它们与机器相关的本机类型是jfloat

因此,您需要将float映射为jfloat内部java类,即实现本机方法的类。

More about JNI types and Data structure

答案 1 :(得分:0)

您可以使用此方法:

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);
}

更多信息可以在这里找到:http://jnicookbook.owsiak.org/recipe-No-013/

至于访问从Java传递到C的对象的字段,你可以在这里找到一些信息:

http://jnicookbook.owsiak.org/recipe-No-020/