四、Jni开发:C语言访问JAVA构造方法、父类方法
2016-08-20 本文已影响108人
re冷星
这篇文章主要介绍了C语言访问JAVA的构造方法、父类方法。
访问构造方法
例子://使用java.util.Date产生一个当前的时间戳
java代码:
//方法声明
public native Date accessConstructor();
然后在main方法中调用
C代码:
//访问构造方法
JNIEXPORT jobject JNICALL Java_JniTest_accessConstructor
(JNIEnv *env, jobject jobj) {
jclass cls = (*env)->FindClass(env, "java/util/Date");
//jmethodID
jmethodID constructor_mid = (*env)->GetMethodID(env, cls, "<init>", "()V");
//实例化一个Date对象
jobject date_obj = (*env)->NewObject(env, cls, constructor_mid);
//调用getTime方法
jmethodID mid = (*env)->GetMethodID(env, cls, "getTime", "()J");
jlong time = (*env)->CallLongMethod(env, date_obj, mid);
printf("\ntime:%lld\n", time);
return date_obj;
}
执行结果
访问父类方法
首先新建两个类,Human和Man
Human:
public class Human {
public void sayHi(){
System.out.println("人类说你好!!");
}
}
Man:
public class Man extends Human{
@Override
public void sayHi() {
System.out.println("男人说你好!!");
}
public void sayHi2(){
super.sayHi();
}
}
在调用类中创建一个Human类,并用子类来实例化。
public Human human = new Man();
C代码:
//调用父类方法
JNIEXPORT void JNICALL Java_JniTest_accessNonvirtualMethod
(JNIEnv *env, jobject jobj) {
jclass cls = (*env)->GetObjectClass(env, jobj);
//获取man属性(对象)
jfieldID fid = (*env)->GetFieldID(env, cls, "human", "LHuman;");
//获取
jobject human_obj = (*env)->GetObjectField(env, jobj, fid);
//执行sayHi方法
jclass human_cls = (*env)->FindClass(env, "Human"); //注意:传父类的名称
jmethodID mid = (*env)->GetMethodID(env, human_cls, "sayHi", "()V");
//执行
(*env)->CallObjectMethod(env, human_obj, mid);
//调用的父类的方法
(*env)->CallNonvirtualObjectMethod(env, human_obj, human_cls, mid);
}
运行结果