C++ и JNI - как передать массив в jfloatArray

я возился с моим собственным маленьким проектом, чтобы научить себя android ndk с помощью c++ и jni, но я не могу понять, как передать данные из массива Java float в массив c++. Я использовал настройку jni. Большинство учебников, которые я нахожу, либо слишком просты и недостаточно объясняют, либо слишком сложны и переходят к моему пониманию на данный момент. Итак, может ли кто - нибудь просто указать мне на простой пример массива, передаваемого с java на C++, а затем выполнить некоторый метод / функцию по данным и отправленным обратно на java.

Heres моя попытка до сих пор, но у меня осталось две ошибки на пути. Я не уверен, что остальная часть синтаксиса тоже в порядке, но я ничего не вижу во время компиляции.

#include <iostream>
#include <Eigen/Dense>
#include <math.h>
#include <jni.h>

using namespace Eigen;

Vector3f vec;
Vector3f vec2;
Vector3f vecRtrn;


void vecLoad(float x, float y, float z, float x2, float y2, float z2){

vec(0) = x;
vec(1) = y;
vec(2) = z;
vec2(0) = x2;
vec2(1) = y2;
vec2(2) = z2;

}

void vecAdd(Vector3f vecA, Vector3f vecB){
vecRtrn = vecA+vecB;
}

extern "C"
{
JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test
(JNIEnv *env, jobject obj, jfloatArray fltarray1, jfloatArray fltarray2){

float array1[3];

jfloatArray flt1 = fltarray1;
jfloatArray flt2 = fltarray2;

//flt1 = env->GetFloatArrayElements( fltarray1,0);
//flt2 = env->GetFloatArrayElements( fltarray2,0);


vecLoad(flt1[0], flt1[1], flt1[2], flt2[0], flt2[1], flt2[2]);
vecAdd(vec, vec2);

array1[0] = vecRtrn[0];
array1[1] = vecRtrn[1];
array1[2] = vecRtrn[2];

return array1;

};
}

и это ошибки во время компиляции

 $ /cygdrive/c/android-ndk-r7/ndk-build
Compile++ thumb  : test <= test.cpp
jni/test.cpp: In function '_jfloatArray* Java_jnimath_act_JnimathActivity_test(JNIEnv*,    _jobject*, _jfloatArray*, _jfloatArray*)':
jni/test.cpp:42: error: cannot convert '_jfloatArray' to 'float' for argument '1' to      'void vecLoad(float, float, float, float, float, float)'
jni/test.cpp:49: error: cannot convert 'float*' to '_jfloatArray*' in return
make: *** [obj/local/armeabi/objs/test/test.o] Error 1

3 ответов


сначала вы не можете использовать jfloatArray напрямую. Вместо этого, вы должны сделать это

JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test
(JNIEnv *env, jobject obj, jfloatArray fltarray1, jfloatArray fltarray2)
{

jfloatArray result;
 result = env->NewFloatArray(3);
 if (result == NULL) {
     return NULL; /* out of memory error thrown */
 }

jfloat array1[3];
jfloat* flt1 = env->GetFloatArrayElements( fltarray1,0);
jfloat* flt2 = env->GetFloatArrayElements( fltarray2,0);


vecLoad(flt1[0], flt1[1], flt1[2], flt2[0], flt2[1], flt2[2]);
vecAdd(vec, vec2);

array1[0] = vecRtrn[0];
array1[1] = vecRtrn[1];
array1[2] = vecRtrn[2];

env->ReleaseFloatArrayElements(fltarray1, flt1, 0);
env->ReleaseFloatArrayElements(fltarray2, flt2, 0);
env->SetFloatArrayRegion(result, 0, 3, array1);
return result;

}

пожалуйста, используйте это как учебник и изучить больше. Как я уже говорил, учеба поможет вам больше, чем практика в это время.


вместо старого стиля (выше кода Тхэ Сунга Сина, все еще работает), мы должны сделать это в наши дни:

jfloatArray result;
result = (*env)->NewFloatArray( env, numbers_here );

этого в основном достаточно для создания пустого массива с новыми ndks. Предполагая, что env - это ваша среда jni.

jfloatArray jArray = env -> NewFloatArray(8);