JNI访问域,调用java方法

java有两类域:实例域和静态域

JNI提供了访问两类域的函数

带有静态域和实例域的java类

public class JavaClass{
//实例域
private String instanceFiled = "Instance Field";
//静态域
private static String staticField = "Static Field";

}

一获取域ID

JNI提供了用域ID访问两类域的方法,可以通过给定的实例class对象来获取域ID,用GetObjectClass函数来获取class对象

//用对象引用获取类
jclass clazz;
clazz = (*env)->GetObjectClass(env, instance);
//获取实例域的域ID
jfieldID instanceField;
instanceField = (*env)->GetField(env,clazz, "instanceField", "Ljava/lang/String");
//获取静态域的ID
jfieldID staticFieldId;
staticFieldId = (*env)->GetStaticField(env,clazz, "staticField", "Ljava/lang/String");

二,获取域

在获取域ID之后,可以用GetField 函数获得实际的实例域

//获取实例域
jstring instanceField;
instanceField = (*env)->GetObjectField(env, instance, instanceFieldID);
//获取静态域
jstring staticField;
staticField = (*env)->GetStaticObjectField(env,clazz,staticFieldId);
//在内存溢出的情况下,这些函数均返回NULL,原生代码不会继续执行

调用方法

java类

public class JavaClass{
//实例方法
private String instanceMethod(){
  return "instance Methid";
 }
//静态方法
private static String staticMethod(){
 return "Static Method";
 }
}

一获取方法ID

//获取实例方法的ID
jmethod instanceMethodID;
instanceMethodId = (*env)->GetMethod(env, clazz, "instanceMehtod", "()Ljava/lang/String;");
//获取静态方法的ID
jmethodID staticMethodId;
staticMethodId = (*env)->GetStaticMethod(env, clazz, "staticMethod", "()Ljava/lang/String;");

二根据ID调用方法

//调用实例方法
jstring instanceMethodResult;
instanceMethodResult = (*env)->CallStringMethod(env,instacne, instanceMethod);
//调用静态方法
jstring staticMethodResult;
staticMethodResult = (*env)->CallStaticStringMethod(env, clazz, staticMethodId)

猜你喜欢

转载自blog.csdn.net/jeekmary/article/details/80069446