`
me-
  • 浏览: 71626 次
  • 性别: 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;
}
 
分享到:
评论

相关推荐

    Android调用Jni返回自定义对象

    当涉及到Android调用JNI并返回自定义对象时,这个过程比简单的数据类型传递更为复杂,但同时也提供了更大的灵活性。 首先,我们需要理解JNI的基本结构。在Android项目中,JNI代码通常被包含在`src/main/jni`目录下...

    android jni 传递对象的demo

    本示例"android jni 传递对象的demo"聚焦于一个特定的应用场景:在Java层和C/C++层之间传递对象。 首先,我们要理解在Java和C/C++之间传递对象的挑战。Java对象在JVM(Java虚拟机)中以引用的形式存在,而C/C++则不...

    JNI中C代码调用使用java属性和方法

    JNI编程中,还应注意到JNI的垃圾收集机制,当在本地代码中创建Java对象时,这个对象也会被垃圾收集器管理。因此,当不再需要时,本地代码应正确地进行资源释放。同时,JNI还提供了直接访问Java类字段和方法的函数,...

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

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

    android JNI学习三实例

    实例可能涉及如何传递Java对象到本地代码,然后在本地代码中调用其方法或修改其属性。 四、注意事项 - **内存管理**:JNI中的内存分配和释放必须由开发者自己管理,避免内存泄漏。 - **线程安全**:如果JNI函数在多...

    android jni开发步骤

    `JNIEnv *env`是JNI环境指针,`jobject`是Java对象的指针,`NewStringUTF`是创建Java字符串的方法。 现在,我们需要配置NDK(Native Development Kit)来编译C/C++代码。确保已经安装了Android NDK,并在Eclipse的...

    高焕堂jni教程

    这通常涉及到定义Java方法的native属性,创建头文件(.h)使用`javah`工具,然后在C/C++代码中实现这些函数,最后通过`System.loadLibrary()`加载动态链接库。 `xxJNI_ch03_CToJava_ok.pdf`章节可能涉及反向过程,...

    JNI-APIsss完全手册.doc

    1. **创建、检查和更新Java对象**:JNI允许本地代码创建新的Java对象,检查对象的状态,以及修改对象的属性,包括数组和字符串。 2. **调用Java方法**:本地代码可以使用JNI调用Java类的方法,无论是静态方法还是...

    JNI_OnLoad动态注册的例子

    `JNIEXPORT`是JNI的一个宏,用来指定导出函数的属性,而`JNICALL`是调用约定,确保参数传递方式与JVM兼容。函数接收两个参数,`JavaVM *`指向JVM的指针,`void *`通常是保留给实现特定用途的,例如传递额外的上下文...

    jni调用c来实现

    这里,`JNIEXPORT`和` JNICALL`是JNI定义的宏,用于指定导出函数的链接属性和调用约定。`JNIEnv*`指向一个结构体,包含了指向Java环境和对象的指针。`jobject`是Java对象的指针。 4. **编译C代码**:使用合适的...

    JNI本地方法访问Java端的属性和方法共9页.pdf.z

    本篇文档《JNI本地方法访问Java端的属性和方法共9页》将深入探讨如何通过JNI来访问和操作Java对象的属性以及调用Java方法。 首先,了解JNI的基本概念是至关重要的。JNI提供了一组API,使得本地(非Java)代码可以与...

    JNI_JAVA_C++.zip

    例如,你可以使用`NewObject`函数创建一个新的Java对象,然后使用`SetXXX`方法设置其属性。 3. **方法调用**:在C++中调用Java的方法,可以使用`CallVoidMethod`, `CallNonvirtualVoidMethod`, `...

    JNI.rar_Android jni_JNI语句_android_jni_site:www.pudn.com

    可以使用`GetObjectClass`获取Java对象的类,`GetMethodID`获取方法ID,`GetFieldID`获取字段ID,然后通过这些ID来访问和修改对象的属性。 ### 异常处理 JNI提供了`Throw`, `ThrowNew`, `ExceptionOccurred`和`...

    Java_JNI_获得系统进程信息实例.doc

    - **`Java_systemProcess_processData`**:遍历由`processHandle()`创建的快照,使用`Process32Next`函数获取每个进程的`PROCESSENTRY32`结构体,然后通过JNI接口向Java对象传递进程信息。 - **异常处理**:通过`...

    android studio JNI

    注意,这里的`JNIEXPORT`和` JNICALL`是JNI的宏定义,用于指定导出函数的属性,`JNIEnv*`是一个指向JNI接口指针的指针,`jobject`是Java对象的类型。 6. **配置CMakeLists.txt**: 如果你的项目使用CMake作为构建...

    JNI设计实践之路

    1. **创建、检查及更新Java对象**:通过JNI,开发者可以在C/C++环境中创建Java对象,对其进行属性读写等操作。 2. **调用Java和非Java程序所编写的方法**:包括调用win32 API等。 3. **捕获和抛出“异常”**:实现了...

    Eclipse JNI Demo

    最后,在JNI方法中通过JNIEnv指针访问Java对象和调用Java方法,实现Java和C/C++之间的交互。 总结起来,【Eclipse JNI Demo】项目是一个典型的Android JNI开发示例,涵盖了从Java到C/C++的交互过程,展示了如何在...

    NDK与JNI基础演示源码

    在描述中提到的“属性、方法、数组引用”,指的是Java对象可以通过JNI接口在本地代码中访问和操作,包括获取和设置字段值、调用方法以及处理Java对象的数组。 接下来,我们探讨NDK。NDK是一套工具集,允许开发者在...

Global site tag (gtag.js) - Google Analytics