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);//调用父类方法  
      
    }  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值