jni 获取java类,JNI(C/C++调用Java父类/子类步骤)

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

back>>

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

- 调用实例方法的三种形式

CallMethod(jobject obj,jmethodID id,....);

CallMethod(jobject obj,jmethodID id,va_list lst);

CallMethod(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. CallNonvirtualMethod

在JNI中定义的CallNonvirtualMethod就能够对子类对象调用父类方法的功能。如果想要调用一个对象的父类方法,而不是子类的这个方法的话,就可以使用CallNonvirtualMethod

使用方式:

首先取得父类及要调用的父类方法的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

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值