不要浮躁,静下心来,踏踏实实地做事.

象勇敢的战士一样调试程序!

用户操作
[即时聊天] [发私信] [加为好友]
shirongxinID:srx
133517次访问,排名623好友0人,关注者1
srx的文章
原创 160 篇
翻译 1 篇
转载 13 篇
评论 41 篇
srx的公告
人生就象是爬山,也许你爬一个山坡已经很久了,一直看不出到顶的迹象,也许你甚至正在走下坡路,支持不住快要放弃了,但要想想,也许山顶就在前面一个小山坡后面,翻过它,你将见到一片美好的天空。
最近评论
wei355300:使用 ActionMessage(message,false);构造函数

errors.add("content", new ActionMessage("content is null!",false));
PeakLui:但我这样这么做不行

validate方法
========================================
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
{

ActionErro……
iefoahz3802:这2篇 jni讲解的确实很清楚 ,谢谢!
wangle00:哥们,你太强了!!谢谢
jameszhou:也许这是正确的解决办法:
http://www.laliluna.de/254.html
文章分类
收藏
相册
javascript
心雨动网
虚拟内存
Java文章
IBM的java教程文章(搜索引擎)
框架
blog很多框架和开元模式
张力海的Blog
杂家
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 jni 代码取得传入参数的对象属性.收藏

新一篇: Eclipse CVS Team文件传不上去的解决办法. | 旧一篇: 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;
}
  

发表于 @ 2006年05月27日 15:14:00|评论(loading...)|编辑

新一篇: Eclipse CVS Team文件传不上去的解决办法. | 旧一篇: jni 代码

评论

#iefoahz3802 发表于2008-03-17 08:47:15  IP: 121.33.253.*
这2篇 jni讲解的确实很清楚 ,谢谢!
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © srx