`
me-
  • 浏览: 69444 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jni 对象 属性

阅读更多
//作者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;
}
 
分享到:
评论

相关推荐

    JNI完全技术手册 带完整书签

    3、实例三、在jni函数中访问java类中的对象实例域... 58 4、实例四:在jni函数中访问类的静态实例域... 60 5、实例五:在jni函数中调用java对象的方法... 60 6、实例六:在jni函数中调用java类的静态方法... 61 ...

    Android JNI native调用 java层demo TESTJNI.zip

    android jni native C++访问java层数组,java类对象属性和方法,回调接口和线程回调接口 内附可以正常使用的demo

    Android JNI学习

    实列是较全面的安卓JNI开发资料,jni访问java属性,设置属性,回调java函数,创建jni进程,新建java对象 可以从以上几个方面对jni进行系统的学习

    java与c++交互(JNI学习笔记)

    1.C++与java交互基本介绍 2.C++获取java属性值、设置java属性值 3.C++创建java对象 4.C++中数据类型间的转换

    JNI技术手册 c/c++调用java

    目录 ...五、 获得类属性的定义: 60 六、 数组处理: 60 七、 异常: 60 八、 多线程调用 61 Java代码 61 命令行运行:javap -s -p MyTest ,输出: 62 C代码testjava.c: 62 编译: 65 运行结果: 65

    《深入理解Android》卷Ⅰ

    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 ...

    大厂真题之京东-Java实习生

    2)方法区中的类静态属性引用的对象,常量引用的对象; 3)本地方法栈中 JNI(Native 方法)引用的对象; 1.2 对象不可达,一定会被垃圾收集器回收么? 即使不可达,对象也不一定会被垃圾收集器回收,1)先判断对象...

    javaRMI完整版.pdf

    2. 可移动属性:RMI 可将属性(类实现程序)从客户机移动到服务器,或者从服务器移到客户机。 3. 安全:RMI 使用 Java 内置的安全机制保证下载执行程序时用户系统的安全。 4. 便于编写和使用:RMI 使得 Java 远程...

    CMS垃圾收集器1

    1. 虚拟机栈中的引用的对象(栈帧中的本地变量表) 2. 方法区中的类静态属性引用的对象 3. 方法区中的常量引用的对象 4. 本地方法栈中JNI的引用的对象

    jdbc连接数据库的方式2

    目前的方法是创建Java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法...

    Oracle Olap开发备忘录

    必须首先获得描述这些数据的元数据的 &lt;br&gt;Source属性对象,才能够通过Cursor访问到数据。这一点很欣赏。仔细学习可以领会很多olap元数据的实现思路。 &lt;br&gt;5、开发时直接使用Rolap测试数据就行了,analysis ...

    深入理解Android卷1全

    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 ...

    Thinking in Java 中文第四版+习题答案

    10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷: 10.4 File类 10.4.1 目录列表器 10.4.2 检查与创建...

    Think in Java(中文版)chm格式

    10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器...

    Java初学者入门教学

    10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...

    JAVA_Thinking in Java

    10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...

    ThinkInJava

    10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...

    java 编程入门思考

    10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...

    thinkinjava

    10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...

    Thinking in Java简体中文(全)

    10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷:RandomAccessFile 10.4 File类 10.4.1 目录列表器 ...

Global site tag (gtag.js) - Google Analytics