jni 代码取得传入参数的对象属性.

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;
}
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值