JNI攻略之七――操作对象的方法
Java中的方法一般有两种:1.实例方法;2.类方法。对应的在JNI中也有两种操作Java对象的方法。下面是如何操作这些方法的例子!
一、 操作实例方法
下面是一个包含一个本地方法的类。本地方法演示了如何操作java类的实例方法。下面是源代码。
public class InstanceMethodCall {
private native void nativeMethod(); //本地方法
private void callback() { //类的实例方法
System.out.println("Called In Java");
}
public static void main(String args[]) {
InstanceMethodCall c = new InstanceMethodCall();
c.nativeMethod(); //调用实例的本地方法
}
static { //加载动态链接库
System.loadLibrary("InstanceMethodCall");
}
}
下面是本地方法的实现。
#include <stdio.h>
#include <stdarg.h>
#include <jni.h>
JNIEXPORT void JNICALL Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj){
jclass cls = (*env)->GetObjectClass(env, obj); //第一步,得到对象的类
jmethodID mid =(*env)->GetMethodID(env,cls, "callback", "()V");
//第二步,得到对象的方法
//第一个参数为env――一般不变
//第二个参数为方法的类
//第三个参数为方法的名称
//第四个参数为方法的signature
if (mid == NULL) { return; }
printf("Called In C n");
(*env)->CallVoidMethod(env ,obj, mid); //第三步,调用方法
//下面会有对该方法的总结
}
结果:
Called In Java
Called In C
操作类的实例方法主要有三个步骤:
1. 得到类的类。使用函数:
jclass GetObjectClass(JNIEnv *env, jobject obj);
2. 得到你要调用的实例方法的标识符。使用函数:
jmethodID GetMethodID(JNIEnv *env, jclass clazz,const char *name, const char *sig);
3. 调用该实例方法。使用函数:
<NativeType> Call<Type>Method(JNIEnv *env,jobject obj, jmethodID methodID, ...);
<Type>可以为byte、short、int、float、double、boolean和char以及其它引用类型。
二、 操作类方法
下面是一个包含一个本地方法的类。本地方法演示了如何操作java类的静态方法。下面是源代码。
public class StaticMethodCall {
private native void nativeMethod(); //本地方法
private static void callback() { //类的静态方法,在本地方法中调用
System.out.println("Called In Java ");
}
public static void main(String args[]) {
StaticMethodCall c = new StaticMethodCall();
c.nativeMethod();
}
static {
System.loadLibrary("StaticMethodCall");
}
}
下面是对本地方法实现的源代码。主要演示如何在本地方法中调用类的静态方法。
#include <stdio.h>
#include <stdarg.h>
#include <jni.h>
JNIEXPORT void JNICALL
Java_StaticMethodCall_nativeMethod(JNIEnv *env, jobject obj){
jclass cls = (*env)->GetObjectClass(env, obj); //第一步,得到对象的类
jmethodID mid =(*env)->GetStaticMethodID(env, cls, "callback", "()V");
//得到对象的静态方法
//与实例方法的区别有一点
//就是方法名多了个Static
if (mid == NULL) { return; }
printf("Called In C n");
(*env)->CallStaticVoidMethod(env, cls, mid); //第三步,调用方法
//与调用实例方法的差别有两点:
//1.方法名加了Static
//方法的第二个参数为jclass类型
}
操作类的静态方法主要有三个步骤:
1. 得到类的类。使用函数:
jclass GetObjectClass(JNIEnv *env, jobject obj);
2. 得到你要调用的静态方法的标识符。使用函数:
jmethodID GetStaticMethodID(JNIEnv *env,jclass clazz, const char *name,const char *sig);
3. 调用该静态方法。使用函数:
<NativeType> CallStatic<Type>Method(JNIEnv *env, jclass clazz,jmethodID methodID, ...);
一定要看好了参数哦!<Type>可以为byte、short、int、float、double、boolean和char以及其它引用类型。
操作对象的方法也是比较简单的!主要分为3步。实例方法和静态方法的使用仅仅是第三步的两个微小的参别!