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