C ++和JNI - 如何通过一个数组成jfloatArray [英] C++ and JNI - How to pass an array into a jfloatArray

查看:7802
本文介绍了C ++和JNI - 如何通过一个数组成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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆