C ++和JNI - 如何通过一个数组成jfloatArray [英] C++ and JNI - How to pass an array into a jfloatArray
问题描述
我一直用我自己的小项目搞乱使用C ++和JNI来教我了Android NDK,但我无法弄清楚如何从一个Java float数组到C ++数组传递数据。我已经使用了JNI成立。最让我找到的教程是不是太简单,不解释不足或过于复杂,走在我此刻的理解。那么,能不能有人只是点我从Java到C ++传递数组的一个简单的例子,然后对数据进行了一些方法/函数并送回爪哇。
我的继承人的尝试,到目前为止,但我留在这样两个错误。林不知道如果语法的其余部分达到标准,但无论是我没有看到在编译时什么。
的#include<&iostream的GT;
#包括LT&;艾根/密>
#包括LT&;&math.h中GT;
#包括LT&;&jni.h GT;使用本征空间;Vector3f VEC;
Vector3f VEC2;
Vector3f vecRtrn;
无效vecLoad(浮法X,浮法Y,浮Z,浮X2,Y2浮动,浮动Z2){VEC(0)= X;
VEC(1)= Y;
VEC(2)= Z;
VEC2(0)= X 2;
VEC2(1)= Y2;
VEC2(2)= Z2;}无效vecAdd(Vector3f VECA,Vector3f vecB){
vecRtrn = VECA + vecB;
}为externC
{
JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test
(JNIEnv的* ENV,jobject OBJ,jfloatArray fltarray1,jfloatArray fltarray2){浮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);数组1 [0] = vecRtrn [0];
数组1 [1] = vecRtrn [1];
数组1 [2] = vecRtrn [2];返回数组1;};
}
而这些错误在编译时
$ / cygdrive / C / Android的NDK-R7 / NDK的构建
++编译大拇指:测试< = TEST.CPP
JNI / TEST.CPP:在函数'_jfloatArray * Java_jnimath_act_JnimathActivity_test(JNIEnv的*,* _jobject,_jfloatArray *,* _jfloatArray):
JNI / TEST.CPP:42:错误:无法转换'_jfloatArray'到'浮动'的说法1到无效vecLoad(浮球,浮球,浮球,浮球,浮球,浮球)
JNI / TEST.CPP:49:错误:返回不能转换成浮动*'到'_jfloatArray *'
使:*** [OBJ /本地/ armeabi / OBJ文件/测试/ test.o]错误1
首先,你不能直接使用jfloatArray。相反,你应该这样做。
JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test
(JNIEnv的* ENV,jobject OBJ,jfloatArray fltarray1,jfloatArray fltarray2)
{jfloatArray结果;
结果= env-> NewFloatArray(3);
如果(结果== NULL){
返回NULL; / *总分抛出内存不足的错误* /
}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);数组1 [0] = vecRtrn [0];
数组1 [1] = vecRtrn [1];
数组1 [2] = vecRtrn [2];env-> ReleaseFloatArrayElements(fltarray1,FLT1,0);
env-> ReleaseFloatArrayElements(fltarray2,FLT2,0);
env-> SetFloatArrayRegion(结果为0,3,数组1);
返回结果;}
请用这个作为一个指南,以及多学习。正如我之前说的,学习将帮助超过这个时间练习你。
I have been messing with my own little project to teach myself the android ndk using c++ and jni but I can't figure out how to pass the data from a java float array to the c++ array. I have used the jni set up. Most the tutorials I find are either too simple and don't explain enough or are too complicated and go over my understanding at the moment. So, can some one just point me to a simple example of an array being passed from java to c++, then have some method/function performed on the data and sent back to java.
Heres my attempt so far but I have two errors left in the way. Im not sure if the rest of the syntax is up to par either but I don't see anything at compile time.
#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;
};
}
And these are the errors at compile time
$ /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
First you can't use jfloatArray directly. Instead, you should do this
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;
}
Please use this as a tutorial and study more. As I said before, studying will help you more than practicing at this time.
这篇关于C ++和JNI - 如何通过一个数组成jfloatArray的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!