`

JNI(C/C++调用Java父类/子类方法)

 
阅读更多

back>>

1. C/C++调用Java函数的形式


    - 调用实例方法的三种形式
    Call<TYPE>Method(jobject obj,jmethodID id,....);
    Call<TYPE>Method(jobject obj,jmethodID id,va_list lst);
    Call<TYPE>Method(jobject obj,jmethodID id,jvalue * v);

    例:

java中方法:
boolean function(int i , bouble d , char c){
    ···
}
//env->CallBooleanMethod(obj , id_function, 100L, 3.44 , L'3');//第一种调用函数形式
//第三种调用形式
jvalue * args = new jvalue[3];//存储参数的数组
args[0].i=100L;
args[1].d=3.44;
args[2].c=L'3';
env->CallBooleanMethod(obj , id_function , args);
delete [] args;//删除内存

 

    - 完整例子 参看C/C++调用Java代码 6

 

2. CallNonvirtual<TYPE>Method

    在JNI中定义的CallNonvirtual<TYPE>Method就能够对子类对象调用父类方法的功能。如果想要调用一个对象的父类方法,而不是子类的这个方法的话,就可以使用CallNonvirtual<TYPE>Method
    使用方式:
    首先取得父类及要调用的父类方法的jmethodID,然后传入到这个函数就能通过子类对象呼叫被覆写(override)的父类的方法

    例子:

    - Java代码

    Father.java

package video1;  
      
public class Father {  
     public void function(){  
          System.out.println("Father:function");  
     }  
}  

    Child.java

package video1;  
public class Child extends Father {        
     public void function() {  
          System.out.println("Child:function");  
     }      
}  

    TestNative.java

package video1;  
import java.util.Date;  
public class TestNative {  
    public native void sayHello();  
    public Father p = new Child();   
    public static void main(String[] args) {   
        System.loadLibrary("nativeCode");//Java类  中加载DLL,然后调用声明的native方法  
        TestNative tst=new TestNative();  
        tst.sayHello();  
    }  
} 

    - C/C++代码

#include "video1_TestNative.h"  
#include<iostream>  
using namespace std;  
JNIEXPORT void JNICALL Java_cn_itcast_TestNative_sayHello (JNIEnv *env, jobject obj){
  
    jfieldID id_p = env->GetFieldID  (clazz_TestNative,"p","Lvideo1/Father;");  
    jobject p = env->GetObjectField(obj,id_p);//取得属性  
      
    jclass clazz_Father = env->FindClass  ("video1/Father");//找到Father类  
    jmethodID id_Father_function = env->GetMethodID(clazz_Father,"function","()V");//获取Father类里面方法的ID  
    //调用方法,取得的是子类方法  
    env->CallVoidMethod(p,id_Father_function);     
    //相当于如下java代码  
    //Father p = tst.p;  
    //p.function();        
    env->CallNonvirtualVoidMethod(p,clazz_Father,id_Father_function);//调用父类方法  
      
    }  

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics