JNI学习笔记3——本地方法取得Java属性/调用java方法

(一)取得Java属性/设定Java属性值

1.取得相应属性的jfieldID之后就可以用
Set<TYPE>Field();
Get<TYPE>Field();
SetStatic<TYPE>Field();
GetStatic<TYPE>Field();
等函数对java属性进行操作
b C++源码部分:

 


2.获取数组属性——>GetObjectField


3.例子:
a java 代码部分:

 

b C++源码部分


(二)Java方法的调用

1.取得相应的jmethodID传入函数的参数中,就可以用
Call<TYPE>Method();
CallStatic<TYPE>Method();
CallNonvittual<TYPE>Method();
等函数对java函数进行调用
 


2.调用形式


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;//删除内存

 

3.调用例子
a java代码部分


b C++源码部分

 

 

 

 

 

3.CallNonvirtual<TYPE>Method
如下java代码:
第一段
public class Father{
    public void function(){
        System.out.println("Father:func");
    }
}

 

第二段
public class Child extends Father{
    public void function(){
        System.out.println("Child:func");
    }
}

问题:如果出现以下代码,问其是调用哪个方法?
Father p = new Child();
p.function();

如下C++代码:
第一段
class Father{
    public:
       virtual void function(){//若加上virtual又如何
       cout<<"Father:func"<<endl;
    }
}

第二段
class Child: public Father
    public: void function(){
        cout<<"Child:func"<<endl;
    }
}

问题:如果出现以下代码,问其是调用哪个成员函数?
Father* p = new Child();
p->function();

在JNI中定义的CallNonvirtual<TYPE>Method就能够对子类对象调

用父类方法的功能。如果想要调用一个对象的父类方法,而不是子类

的这个方法的话,就可以使用CallNonvirtual<TYPE>Method

使用方式:
首先取得父类及要调用的父类方法的jmethodID
然后传入到这个函数就能通过子类对象呼叫被覆写(override)的父

类的方法

使用实例
(1)新增Father类


(2)新增Child类


(3)java代码部分


(4)C++源码部分

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值