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 *pFilter = NULL;
    jint filter_num = 0;
    jint column_num = 0;
    jint i;
    jintArray filter_tmp;
    jint mem_length = 0;

filter_num = env->GetArrayLength(array_filter);
    DBG("filter_num = %d\n", filter_num);

mem_length = filter_num * sizeof(struct can_filter);
    pFilter = (struct can_filter*)malloc(mem_length);
    if (NULL == pFilter) {
     LOG_ERR("memory is not enough, allocate failed\n");
     return -2;
    }

for (i = 0; i < filter_num; i++) {
     filter_tmp = (jintArray)(env->GetObjectArrayElement(array_filter, i));
     column_num = env->GetArrayLength(filter_tmp);
     
     if (2 != column_num) {
      LOG_ERR("array_filter column != 2, we only need can_id and can_mask\n");
      return -1;
     }

jint *pColumnData = env->GetIntArrayElements(filter_tmp, 0 );
     pFilter[i].can_id = pColumnData[0];
     pFilter[i].can_mask = pColumnData[1];
     DBG("%d:id=0x%x,mask=0x%x\n", i, pFilter[i].can_id, pFilter[i].can_mask);
     env->ReleaseIntArrayElements(filter_tmp, pColumnData, 0);
    }

jint ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_FILTER, pFilter, mem_length);

free(pFilter);
    return ret;
}

java中调用的代码如下:

int[][] can_filter = {
   {0x234,0x7FF},
   {0x235,0x7FF}
  };

canTest.setFilter(s, can_filter);

时间: 2024-09-29 01:24:02

java JNI 二维数组作为方法参数传递给本地的相关文章

JAVA遍历二位数组的方法

//使用方法对于二维数组进行遍历 package com; import java.util.Arrays; public class CompoundInterest { public static void main(String[] args) { // TODO Auto-generated method stub double[][] balances= new double[3][3]; for(int j = 0; j < balances[0].length; j++){ bal

二维数组名做参数传递问题

在用二维数组名作为参数传递时容易出现Segmention Error.这是因为不能正确为二维数组中元素寻址的问题,正确的方法如下: #include <stdlib.h> #include <stdio.h> #define N 4 void testArray(int *a, int m, int n) { for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) { printf("a[%d][%d] =

6、JAVA基础-二维数组 及 面向对象理解

1:二维数组(理解) (1)元素是一维数组的数组. (2)格式: A:数据类型[][] 数组名 = new 数据类型[m][n]; B:数据类型[][] 数组名 = new 数据类型[m][]; C:数据类型[][] 数组名 = new 数据类型[][]{{...},{...},{...}}; D:数据类型[][] 数组名 = {{...},{...},{...}}; (3)案例(掌握): A:二维数组的遍历 B:二维数组的求和 C:杨辉三角形 2:两个思考题(理解) (1)Java中的参数传递

JAVA:二维数组

一.二维数组相关语法 /* 二维数组:就是元素为一维数组的一个数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的元素有多少个. 注意: 以下格式也可以表示二维数组 a:数据类型 数组名[][] = new 数据类型[m][n]; b:数据类型[] 数组名[] = new 数据类型[m][n]; */ class Array2Demo { public static void main(String[]

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

二维数组与方法(函数)

二维数组 什么是二维? ? 比如(合金弹头.超级玛丽) ? 二维数组里面放一维数组. 什么是二维数组? ? 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”, ? 二维数组又称为矩阵,行列数相等的矩阵称为方阵 怎么创建一个二维数组? 数据类型[][] 对象名 = new 数据类型[x][y]; x代表行 y代表列 例如:  int [ ][ ] a = new int [2] [2]; 数组 : 使用索引来操作元素, 下面给二维数组赋值 a[0] [0] = 1; //第一行第一列 a

Java的二维数组的应用及杨辉三角的编写

(1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个,即该位置上的元素在该行上最大,在该列上最小(注:一个二维数组也可能没有这样的鞍点). /** * * @author liuhui *@version Java上机实验三 *@time 2016.10.30 */ public class javatest2 { public static int

C++中关于二维数组作为函数参数传递的问题

在做数据结构迷宫实验的时候,要生成一个二维数组存储迷宫数据,为了保证程序的模块化,将生成部分单独放进一个函数migongsc()里.大致代码如下: 问题的关键就集中在了如何将主函数中声明的二维数组migong[8][9]传递到自定义函数中去. 耗费了一个晚上的时间,我总共整理出了三种办法: 方法1:模拟编译器寻址(本法来自CSDN博客,原文: http://blog.csdn.net/jatix/archive/2004/08/29/88150.aspx). 大体意思为:将二维数组当作参数的时候

二维数组作为函数参数传递剖析

前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} //以下两种可以忽略行数 f(int daytab[][13]) {...} f(int (*daytab)[13]) {...} 甚至会有人告诉你多维数组作为参数传递可以省略第一维,其他维不能省略.然而你对这种形式并不满意:如果事先限定了二维数组的大小,函数的泛用性就要大打折扣了.因为你真正需要的,