//作者srx@csdn
class pp{
public String tmp ;
public void setTmp(String tmp_){
this.tmp = tmp_;
}
public String getTmp(){
return this.tmp ;
}
}
class myClass{
public pp a ;
public pp b ;
public pp getA(){
return a;
}
public pp getB(){
return b;
}
public void setA(pp a_){
this.a = a_;
}
public void setB(pp b_){
this.b = b_;
}
}
public class test {
static{
System.loadLibrary("c-so-jni");
}
public native void fun(myClass param);
public native void myprintf();
public static void main(String[] args) {
test obj = new test();
//obj.myprintf();//just for test jni.
myClass param = new myClass();
param.a = new pp(); param.a.tmp="aaa";
param.b = new pp(); param.b.tmp="bbb";
obj.fun(param);
}
}
------------------------------ javah -jin test 生成test.h ----------------------------------
test.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test */
#ifndef _Included_test
#define _Included_test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: test
* Method: fun
* Signature: (LmyClass;)V
*/
JNIEXPORT void JNICALL Java_test_fun
(JNIEnv *, jobject, jobject);
/*
* Class: test
* Method: myprintf
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_test_myprintf
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
---------------------------------- 建立C Manage Project ,类型选择Share Library----------------
c-so-jni.h
#ifndef CSOJNI_H_
#define CSOJNI_H_
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test */
#ifndef _Included_test
#define _Included_test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: test
* Method: fun
* Signature: (LmyClass;)V
*/
JNIEXPORT void JNICALL Java_test_fun
(JNIEnv *, jobject, jobject);
/*
* Class: test
* Method: myprintf
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_test_myprintf
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
#endif /*CSOJNI_H_*/
----------------------------c-so-jni.c------------------------------------------------
#include "c-so-jni.h"
JNIEXPORT void JNICALL Java_test_fun
(JNIEnv *env, jobject obj, jobject param){
//在这里我如何得到myClass 对象param的各个属性?
//并且修改他们后传回给java程序?
jclass cls = (*env)->FindClass(env,"myClass");
// get myClass.a
jfieldID fid = (*env)->GetFieldID(env,cls,"a","Lpp;");
jobject pro = (*env)->GetObjectField(env,param,fid);
// get myClass.a
jmethodID mid_getA = (*env)->GetMethodID(env,cls,"getA","()Lpp;");
jobject ppObj = (jobject)(*env)->CallObjectMethod(env,param,mid_getA);
//get pp.tmp
jclass pp_cls = (*env)->FindClass(env,"pp");
// jmethodID mid_getTmp =(*env)->GetMethodID(env,pp_cls,"getTmp","()Ljava/lang/String;");
// jstring tmpstr =(jstring) (*env)->CallObjectMethod(env,pro,mid_getTmp);
jfieldID fid_pp_tmp = (*env)->GetFieldID(env,pp_cls,"tmp","Ljava/lang/String;");
jstring pptmp = (jstring)(*env)->GetObjectField(env,pro,fid_pp_tmp);
char * str =(char*) (*env)->GetStringUTFChars(env,pptmp,NULL);
printf("fun myclass.a.tmp=[%s]\n",str);
}
JNIEXPORT void JNICALL Java_test_myprintf
(JNIEnv * env, jobject obj){
printf("hello");
}
---------------------------------over -----------------------------------------
在最后的c-so-jni.c中,实现了,取得java对象,获得其属性.
的方法.
也可以获得java对象,调用它的方法.
c-so-jni.c中施用的类型例如,()Ljava/lang/String;可施用java明令获得.
例如,javap -s -public pp
javap -s -public myClass
------------ 输出如下:---------------
[shirx@localhost bin]$ javap -s -public myClass
Compiled from "test.java"
class myClass extends java.lang.Object{
public pp a;
Signature: Lpp;
public pp b;
Signature: Lpp;
public pp getA();
Signature: ()Lpp;
public pp getB();
Signature: ()Lpp;
public void setA(pp);
Signature: (Lpp;)V
public void setB(pp);
Signature: (Lpp;)V
}
[shirx@localhost bin]$ javap -s -public pp
Compiled from "test.java"
class pp extends java.lang.Object{
public java.lang.String tmp;
Signature: Ljava/lang/String;
public void setTmp(java.lang.String);
Signature: (Ljava/lang/String;)V
public java.lang.String getTmp();
Signature: ()Ljava/lang/String;
}
分享到:
相关推荐
3、实例三、在jni函数中访问java类中的对象实例域... 58 4、实例四:在jni函数中访问类的静态实例域... 60 5、实例五:在jni函数中调用java对象的方法... 60 6、实例六:在jni函数中调用java类的静态方法... 61 ...
android jni native C++访问java层数组,java类对象属性和方法,回调接口和线程回调接口 内附可以正常使用的demo
实列是较全面的安卓JNI开发资料,jni访问java属性,设置属性,回调java函数,创建jni进程,新建java对象 可以从以上几个方面对jni进行系统的学习
1.C++与java交互基本介绍 2.C++获取java属性值、设置java属性值 3.C++创建java对象 4.C++中数据类型间的转换
目录 ...五、 获得类属性的定义: 60 六、 数组处理: 60 七、 异常: 60 八、 多线程调用 61 Java代码 61 命令行运行:javap -s -p MyTest ,输出: 62 C代码testjava.c: 62 编译: 65 运行结果: 65
3.2.4 属性服务 3.3 本章小结 第4章 深入理解zygote 4.1 概述 4.2 zygote分析 4.2.1 AppRuntime分析 4.2.2 Welcome to Java World 4.2.3 关于zygote的总结 4.3 SystemServer分析 4.3.1 SystemServer的诞生 4.3.2 ...
2)方法区中的类静态属性引用的对象,常量引用的对象; 3)本地方法栈中 JNI(Native 方法)引用的对象; 1.2 对象不可达,一定会被垃圾收集器回收么? 即使不可达,对象也不一定会被垃圾收集器回收,1)先判断对象...
2. 可移动属性:RMI 可将属性(类实现程序)从客户机移动到服务器,或者从服务器移到客户机。 3. 安全:RMI 使用 Java 内置的安全机制保证下载执行程序时用户系统的安全。 4. 便于编写和使用:RMI 使得 Java 远程...
1. 虚拟机栈中的引用的对象(栈帧中的本地变量表) 2. 方法区中的类静态属性引用的对象 3. 方法区中的常量引用的对象 4. 本地方法栈中JNI的引用的对象
目前的方法是创建Java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法...
必须首先获得描述这些数据的元数据的 <br>Source属性对象,才能够通过Cursor访问到数据。这一点很欣赏。仔细学习可以领会很多olap元数据的实现思路。 <br>5、开发时直接使用Rolap测试数据就行了,analysis ...
3.2.4 属性服务 / 52 3.3 本章小结 / 60 第4章 深入理解zygote / 61 4.1 概述 / 62 4.2 zygote分析 / 62 4.2.1 AppRuntime分析 / 63 4.2.2 Welcome to Java World / 68 4.2.3 关于zygote的总结 / 74 4.3 ...
10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷: 10.4 File类 10.4.1 目录列表器 10.4.2 检查与创建...
10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器...
10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...
10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...
10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...
10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...
10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...
10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...