JAVA本地方法调用(2)数组参数传递
来源:互联网 发布:php redis抢红包源代码 编辑:程序博客网 时间:2024/06/06 02:40
JAVA可以把数组作为参数传递给本地方法,在本地方法中可以访问数组中的元素。
不过,在本地方法却不能直接访问传进来的数组,需要进行一定的转换。举例说明:
1、创建 JAVA 类:
package test; public class Test { public native void copy(int[] a, int[] b); public static void main(String[] args){ System.load("/root/mycodes/native/intArrayCpy/Test.so"); Test obj = new Test(); int[] a = new int[]{1, 2, 3, 4, 5}; int[] b = new int[a.length]; obj.copy(a, b); String pre = "\r\n\r\n"; for(int i : b){ System.out.print(pre + i); pre = ", "; } System.out.println(); }}
2、编译并生成 .h 文件:
javac -d . Test.javajavah -jni test.Test
3、编写 c 源程序,可以将 javah 生成的文件拷贝成 c 文件,然后在上面修改:
cp test_Test.h test_Test.cvim test_Test.c
修改之后的C源程序如下:
#include <jni.h>/* Header for class test_Test */ #ifndef _Included_test_Test#define _Included_test_Test#ifdef __cplusplusextern "C" {#endif/* * Class: test_Test * Method: copy * Signature: ([I[I)V */JNIEXPORT void JNICALL Java_test_Test_copy (JNIEnv * env, jobject obj, jintArray pA, jintArray pB){ int a[5]; int b[5]; int i; jsize size = (*env)->GetArrayLength(env, pA); (*env)->GetIntArrayRegion(env, pA, 0, size, a); for(i=0; i<5; i++){ b[i] = a[i]; } (*env)->SetIntArrayRegion(env, pB, 0, 5, b);} #ifdef __cplusplus}#endif#endif
4、编译并运行:
gcc -I/usr/java/jdk1.7.0/include/ -I/usr/java/jdk1.7.0/include/linux -fPIC -shared -o Test.so test_Test.cjava test.Test
注意在 Test.java 文件中,System.load 中的参数是由上面的 gcc 命令生成的 so 文件的全路径
观察发现,如果要访问由JAVA虚拟机传进来的数组,必须调用 env 提供的函数进行转换。在 jdk 安装目录下查找 jni.h 文件,可以发现jdk其实为我们定义了很多转换函数。比如上面的代码中用到了:
GetArrayLength 得到传入的数组参数的元素个数
GetIntArrayRegion 将JAVA虚拟机传进来的整数数组元素拷贝到本地的整数数组
SetIntArrayRegion 将本地的整数数组拷贝到传进来的参数中,以便传回
- JAVA本地方法调用(2)数组参数传递
- JAVA本地方法调用(3)对象参数传递
- Android-调用本地方法传递数组参数/NDK-JNI开发实例(五)
- Java方法调用时传递参数问题
- dwr调用参数为 对象数组 的方法(js中直接传递obj数组)
- VBA调用C#对象方法,传递double数组参数
- JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组
- java方法参数传递
- Java方法参数传递
- Java 方法参数传递
- Java方法参数传递
- Java方法参数传递
- java方法参数传递
- 关于Java中方法调用时参数的传递
- c/c++/java,函数调用的参数的传递方法
- 关于Java中方法调用时参数的传递
- java 反射调用有参方法,并传递参数
- 关于Java中方法调用时参数的传递
- MAC如何显示隐藏文件和隐藏隐藏文件的命令
- linux内核的运行
- 堆与栈存储效率的一点理解
- IP冲突解决方案
- baidu-2011
- JAVA本地方法调用(2)数组参数传递
- C语言如何 计算程序运行时间?
- UNIX环境高级编程第三章文件I/O 读后笔记
- rpc4Django无法并行开多个RPCURL问题
- WM_NOTIFY
- sqlDbx连接mysql 及乱码
- python中用pdb 来调试
- 能够分页显示的Label控件
- 为自己的梦想而奋斗