Android jni 二维数组 传递

学习Android Jni时,一个二维 整数 数组的传递花了我好长时间,在网上查的资料都不全,当然最后是成功了,写在这里是为了自己记住,当然有人搜索到并利用了我会很高兴。

in Android Java file

public native boolean  add(int[][] qizidata,.....)

用JDK工具生产jni 的*.h文件

your project path> ..Javajdk1.6.0_10binjavah -classpath ./bin JAVA Class name

//**************************************************************************

//二维数组java -》Jni

JNIEXPORT jint JNICALL Java_com_Jung_add

(JNIEnv * env, jobject
obj, jobjectArray qizidata,jint value1, jint
value2)

{

jint
i,j;

jint
qizi[1024][1024];  //固定数组,测试用

jarray
myarray;

int
size = (*env)->GetArrayLength(env, qizidata);

for (i
= 0; i < size &&
i<1024 ; i++)

{

myarray =
((*env)->GetObjectArrayElement(env, qizidata,
i));

int col =
 (*env)->GetArrayLength(env,
myarray);

jint *coldata =
(*env)->GetIntArrayElements(env, (jintArray)myarray,
0 );

for (j=0; j<col
&& j <1024;
j++)

{

qizi[i][j]
= coldata[j];

}

(*env)->ReleaseIntArrayElements(env,
(jintArray)myarray, coldata,0 );

}

return
(qizi[0][0]+qizi[9][0]);

}

//**************************************************************************

//二维数组Jni -》Java

JNIEXPORT jobjectArray JNICALL
Java_com_marakana_NativeLib_GetIntArray

(JNIEnv *env, jobject obj, jint
x, jint y)

{

jobjectArray ret;

int i =
0;

int j =
0;

jclass
intArrCls = (*env)->FindClass(env, "[I");

if (
NULL== intArrCls)

return NULL;

ret =
(*env)->NewObjectArray(env, x * y, intArrCls,
NULL);

jint
tmp[1024];//固定数组,测试用,注意别溢出

for (i
= 0; i < x; i++) {

jintArray intArr =
(*env)->NewIntArray(env,y);

for (j = 0; j <
y; j++) {

tmp[j] = i + j;

}

(*env)->SetIntArrayRegion(env,intArr, 0, y,
tmp);

(*env)->SetObjectArrayElement(env,ret, i,
intArr);

(*env)->DeleteLocalRef(env,intArr);

}

return
ret;

}

//**************************************************************************

//下面代码是网上搜的,没验证,忘记出处了,请原作者见谅

// 二维String数组 JNI 提取
 c_languge syntax

JNIEXPORT void JNICALL Java_TestArray_PrintArrays

(JNIEnv *env, jclass class, jobjectArray array)

{

int
size = (*env)->GetArrayLength(env, array);

for
(int i = 0; i < size; i++)

{

jarray myarray =
((*env)->GetObjectArrayElement(env, array,
i));

int leng =
(*env)->GetArrayLength(env, myarray);

printf("length: %dn",
leng);

for (int j = 0; j
< leng; j++)

{

jstring string =
((*env)->GetObjectArrayElement(env, myarray,
i));

const char * chars =
(*env)->GetStringUTFChars(env, string, 0);

printf("%s n", chars);

(*env)->ReleaseStringUTFChars(env,
string, chars);

}

}

}

时间: 2024-10-12 19:34:46

Android jni 二维数组 传递的相关文章

c语言二维数组传递

c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维的长度 * *********************************/ void fun(int a[][3], int n, int m) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) printf(&quo

c++ 二维数组传递

我们在传递二维数组时,对于新手来说,可能会存在某些问题,下面讲解几种传递方法 在讲解如何传递二维数组时,先看看如何动态new 二维数组 1 // 二维数组动态申请 2 int row ,col ; 3 cin >> row >> col; 4 5 int** arr; 6 // c++ 形式 7 arr = new int*[row]; 8 for(int i = 0;i<row;i++) 9 arr[i] = new int[col]; 10 11 // c 形式 12 a

android解析二维数组对象key:value

JSONArray jsonArray = jsonObject.optJSONArray("data"); // array = dataObj.getJSONArray("data"); //JSONArray array = dataObj.getJSONArray("result"); if (jsonArray != null && jsonArray.length() > 0) { for (int i = 0;

java JNI 二维数组作为方法参数传递给本地

java里面有如下本地定义: private static native int setFilter(final int fd, final int[][] array_filter); c++中对应的函数如下: JNIEXPORT jint JNICALL Java_JniSocketCan_setFilter  (JNIEnv *env, jclass obj, jint fd, jobjectArray array_filter){    struct can_filter *pFilte

二维数组的传输 (host &lt;-&gt; device)

前言 本文的目的很明确:介绍如何将二维数组传递进显存,以及如何将二维数组从显存传递回主机端. 实现步骤 1. 在显存中为二维数组开辟空间 2. 获取该二维数组在显存中的 pitch 值 (cudaMallocPitch 实现) 3. 将二维数组传递进显存 (cudaMemcpy2D 实现) 4. 在显存中对该二维数组进行处理 (目前必须按照 1 维数组的规则进行处理) 5. 将结果传递回内存 (cudaMemcpy2D实现) 重要概念 - pitch 对于内存的存取来说,对准偏移量为2的幂(现在

二维数组 我被你搞糊涂了

转载自:http://blog.chinaunix.net/uid-26694208-id-3842773.html 指向一个由n个元素所组成的数组指针 在Turbo C中, 可定义如下的指针变量: int (*p)[3]; 指针p为指向一个由3个元素所组成的整型数组指针(指向数组的指针).在定义中, 圆括号是不能少的, 否则它是指针数组.这种数组的指针不同于前面介绍的整型指针, 当整型指针指向一个整型数组的元素时, 进行指针(地址)加1运算, 表示指向数组的下一个元素, 此时地址值增加了2(因

黑马程序员——c语言学习心得——函数传递二维数组

黑马程序员——c语言学习心得——函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.   变量定义的时候给变量初始化,这是保证不出错的一个很好的习惯.尤其是在指针的使用上,如果我们没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问.那么如何初始化指针变量呢,一般有以下几种方法:   1.初始化空指针   int* pInteger=N

Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层.我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下. 示例代码的主要文件有两个,一个是Native.java,是Java层的类:另一个是Native.c,是JNI层的文件,关键的地

转:Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层.我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下. 示例代码的主要文件有两个,一个是Native.java,是Java层的类:另一个是Native.c,是JNI层的文件,关键的地