JNI学习笔记三

访问java类中的属性和方法
 jfileID 属性
 jmethodID  方法


JNIEnv  的函数
 GetFieldID
 GetStaticFieldID
 GetMethodID
 GetStaticMethodID
  示例代码
   env_>GetMethodID(data_Clazz,"<int>","()V")




  
  整体实例方法
 
   java 代码
   public class TestNative{
public void function(int i){
  System.out.printfln("integer:"+i);
        }


  public void function(double d){
System.out.println("double:"+d);
         } 
   }


  在c/c++代码中调用function方法
   //  首先取得testNative类
   jclass clazz_TestNative =env_>FindClass("cn/yue/TestNative");
    //  取得methodID     
    //最后一个参数  sign
                    如果指定为"(I)V"  则取function(int i)方法的id
                    如果指定为"(D)V"  则取function(double d)方法的id   
   jmethodID id_func=env->GetMethodID(clazz_TestNative,"function","");
 
    类型对应签名
   


    boolean             z
    byte                b
    char                c
    short               s
    int                 i
    long                l
    float               f
    double              d
    void                v
    object              L用/分鬲完整类名;   Ljava/lang/String;
    Array               [签名             [I
    Method              (参数1类型签名,参数2签名)返回值类型的签名
    




  命令javap可以生成
  javap -s -private 类的全路径(bin目录下)




  取得java类中的属性值
   //取得java类中的属性
jclass clazz_TestNative=env->GetObjectClass(obj);
jfieldID id_number=env->GetFieldID(clazz_TestNative,"number","I");
jint number=env->GetIntField(obj,id_number);
cout<<number<<endl;
env->SetIntField(obj,id_number,100);
 取得java类中的方法
    调用实例方法的三种形式:
    1   Call<TYPE> Method(Jobject obj,jmethodID id);
     方法一:
       如果java 中方法为
       boolean function(int i,double d,char c){}
       本地方法的代码为:
       env->CallBooleanMethod(obj,id_function,100L,3.44,L'3');
    2   Call<TYPE> MethodV(jobject obj,jmethodID id,va_list lst);
        //jvalue 是一种联合体类型 
    3   Call<TYPE> MethodA(jobject obj,jmethodID id,jvalue * v );
      示例代码:
     jvalue * args=new jvalue[3];
      args[0].i=100L;
      args[1].d=3.44;
      args[3].c=L'3';
     env->CallBooleanMethodA(obj,id_function,args);
      delete[] args;


     调用静态方法
    1   CallStatic <TYPE> Method(Jobject obj,jmethodID id);  
    2   CallStatic <TYPE> MethodV(jobject obj,jmethodID id,va_list lst);
        //jvalue 是一种联合体类型 
    3   CallStatic <TYPE> MethodA(jobject obj,jmethodID id,jvalue * v );


   子类调用父类中的方法
    java代码如下:
    public class Father {
public void function() {
System.out.println("Father:function");
}
     }


    public class Child extends Father {


@Override
public void function() {
System.out.println("Child: function");
}
     }
  
    入口函数中定放如下属性
   public Father p=new Child();
  
    
    //本地方法实现


jfieldID id_p=env->GetFieldID(clazz_TestNative,"p","Lcn/yue/jni/Father;");
jobject p=env->GetObjectField(obj,id_p);


jclass clazz_Father=env->FindClass("cn/yue/jni/Father");
jmethodID id_father_function=env->GetMethodID(clazz_Father,"function","()V");
//调用子类的方法
//env->CallVoidMethod(p,id_father_function);


//调用父类的方法: 
env->CallNonvirtualVoidMethod(p,clazz_Father,id_father_function);
        
    env->CallNonvirtualVoidMethod(p,clazz_Father,id_father_function);
posted @ 2012-09-04 10:27  retacn_yue  阅读(209)  评论(0编辑  收藏  举报