JAVA本地方法调用(3)对象参数传递
来源:互联网 发布:剑三商城数据导入非法 编辑:程序博客网 时间:2024/06/03 19:21
JAVA可以将一个对象作为参数传递给本地方法,在本地方法中也可以访问这个对象的属性。不过在本地方法中调用这个对象的方法可就不会象在 JAVA 中那么随心所欲了。它必须通过本地方法传进来的第一个参数 env 进行调用,这种方式很象在JAVA中通过反射来创建对象、调用方法。
举例说明:
1、创建一个类,这个类的对象将作为参数传到本地方法中。
package test; public class Person { private int age; public int getAge(){ return age; } public void setAge(int value){ this.age = value; } public Person(int age){ this.age = age; }}
2、创建测试类,在测试类中将创建 Person 对象,并将它作为参数传给一个本地方法,在本地方法中通过调用 getAge 方法打印年龄,通过调用 setAge 方法修改 Person 对象的年龄:
package test; public class Test { private native void setAge(Person person); public static void main(String[] args){ System.load("/root/mycodes/native/obj/Test.so"); Test t = new Test(); Person p = new Person(20); System.out.println("age = " + p.getAge()); t.setAge(p); System.out.println("age = " + p.getAge()); }}
3、编译 java源程序,并创建 .h 头文件
在命令行中(linux环境下):
javac -d . Person.java
javac -d . Test.java
javah test.Test
cp test_Test.h test_Test.c
4、编辑 test_Test.c之后的文件内容如下:
#ifndef __test_Test__#define __test_Test__ #include <jni.h>#include <stdio.h> #ifdef __cplusplusextern "C"{#endif JNIEXPORT void JNICALL Java_test_Test_setAge (JNIEnv *env, jobject obj1, jobject obj2){ jclass personCls = (*env)->GetObjectClass(env, obj2); if(personCls == NULL){ printf("person get failed\r\n"); return; } jmethodID setMethod = (*env)->GetMethodID(env, personCls, "setAge", "(I)V"); jmethodID getMethod = (*env)->GetMethodID(env, personCls, "getAge", "()I"); jint age = (*env)->CallIntMethod(env, obj2, getMethod); printf("------ before age is :%d\r\n", age); (*env)->CallVoidMethod(env, obj2, setMethod, 30); age = (*env)->CallIntMethod(env, obj2, getMethod); printf("------ after age is %d\r\n", age);} #ifdef __cplusplus}#endif #endif /* __test_Test__ */
哦,对了,忘记说在这里使用的 (*env)->GetMethodID 函数的最后一个参数应该写什么了。
这个参数应该是JAVA的类的方法的签名,它可以通过jdk的工具 javap 得到。如上面的 test.Person 类中的 setAge 方法,可以在命令行里执行:
javap -s test.Person
得到 test.Person 的所有方法的签名。
gcc -I/usr/java/jdk1.7.0/include/ -I/usr/java/jdk1.7.0/include/linux -fPIC -shared -o Test.so test_Test.c
java test.Test
输出:
age = 20
------ before age is :20
------ after age is 30
age = 30
不多解释了,程序比文字更能说明问题
- JAVA本地方法调用(3)对象参数传递
- JAVA本地方法调用(2)数组参数传递
- Java方法调用时传递参数问题
- java之给方法传递对象参数
- Android-调用本地方法传递数组参数/NDK-JNI开发实例(五)
- VBA调用C#对象方法,传递double数组参数
- CXF调用传递对象参数
- java 18:给方法传递对象参数,对象数组
- dwr调用参数为 对象数组 的方法(js中直接传递obj数组)
- JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组
- java方法参数传递
- Java方法参数传递
- Java 方法参数传递
- Java方法参数传递
- Java方法参数传递
- java方法参数传递
- 关于Java中方法调用时参数的传递
- c/c++/java,函数调用的参数的传递方法
- 不要自称为程序员
- Android深入浅出之Audio
- Excel中怎么获取以列中月份数(一年内)
- jQuery Form Plugin以ajax方式提交CKEditor编辑的内容丢失
- 基于jquery的商品图片tips提示框
- JAVA本地方法调用(3)对象参数传递
- 我真的是理性的人吗?——《怪诞行为学》读后有感
- 10046诊断事件——跟踪SQL语句!
- C语言多线程编程(windows下)【用pthread】
- 过滤所有HTML标记
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析
- 去 字符串中掉所有的空格
- VC下添加和删除系统托盘图标,处理响应事件(Shell_NotifyIcon)
- C++ 数组指针 和 指针