я искал решение в Интернете, и мой код выглядит так же, как и другое решение. Я думаю, что GetFloatArrayElements предназначен для получения элемента массива.
вот мой код:
JNIEXPORT void JNICALL
Java_draw(JNIEnv *env, jfloatArray point){
float temp[6];
float x = 0;
jfloat *body = env->GetFloatArrayElements(point, 0);
for(int i =0; i < 6 ; i++){
temp[i] = body[i];
x+= body[i];
__android_log_print(ANDROID_LOG_ERROR, "TRACKERS123", "[%f]", *(body + i) );
}
env->ReleaseFloatArrayElements(point, body, 0);
}
результат всегда такой:
[21.774231]
[0.000000]
[21.707932]
[21.776413]
[0.000000]
[0.000000]
я проверил вызывающий код из отладки. вот пример значения:
Просто: рисовать (точка)
Пустое рисование (точка с плавающей запятой)
Подтверждает ли GetArrayLength, что ваш массив состоит из 6 элементов?
Нет, только 1 элемент
Тогда почему ты всегда читаешь шесть элементов? Все, что после первого, просто случайный мусор.
Потому что я всегда передаю этому методу 6 элементов массива. Это гарантировано. Или любая идея?
Вы только что сказали мне, что GetArrayLength возвращает 1. Как это возможно, если вы «всегда передаете 6 элементов»?
Прости. показывает 1100999584. jsize x = env -> GetArrayLength (точка) ; __android_log_print(ANDROID_LOG_ERROR, "TRACKERS123", "размер %i", x);





Подпись вашего метода Java_draw неверна: (источник)
JNIEnv*.jclass.jobject, представляющий экземпляр объекта.float[].Итак, подпись должна быть:
JNIEXPORT void JNICALL Java_draw(JNIEnv *env, jclass klass, jfloatArray point) // static
или
JNIEXPORT void JNICALL Java_draw(JNIEnv *env, jobject obj, jfloatArray point) // non-static
Вау, спасибо. поэтому мы должны добавить JNIEnv и jclass. Я думал, мы просто добавим то, что нам нужно. и спецификация JNI меня смущает (docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/…)
Этот бит был объяснен в разделе Аргументы собственного метода.
Как вы вызываете этот код из Java? Как выглядит объявление метода «draw»?