jni回调java静态方法_Android Stuido Ndk-Jni 开发(五):Jni回调java静态方法和非静态方法...

Android Stuido Ndk-Jni 开发(五):Jni回调java静态方法和非静态方法

public native String getStringFromJni();

public void printHelloWorld(){

Log.d(TAG, "hello world! by unstatic method");

}

public static void printStaticHelloWorld(){

Log.d(TAG, "hello world! by static method");

}

1. jni回调静态方法

JNIEXPORT jstring JNICALL Java_com_dj_jni_jnimodule_NativeHelper_getStringFromJni

(JNIEnv *env, jobject obj){

jclass cls = (*env)->FindClass(env, "com/dj/jni/jnimodule/NativeHelper");

// jclass cls = (*env)->GetObjectClass(env, obj);

jmethodID callback = (*env)->GetStaticMethodID(env, cls, "printStaticHelloWorld", "()V");

(*env)->CallStaticVoidMethod(env, cls, callback);

return (*env)->NewStringUTF(env,"Hello from JNI !");

}

参数JNIEnv 和 jobject的解释:

参数JNIEnv* env实际上代表了Java环境,通过JNIEnv* 这个指针就可以对Java端的代码进行操作。

例如调用java对象的方法、获取java对象的属性、创建java对象等等。

jobject obj的含义取决于该native方法是不是static,比如public native String getStringFromJni();就不是static

如果native方法是static,obj表示这个natvie方法所在类的class对象。因为static方法不需要类实例。

如果native方法不是static,obj表示这个native方法所在的类的实例。

注意:

回调static方法,不需要用到obj。只需要通过(*env)->FindClass(env, "class name");获取类class对象。也可以通过(*env)->GetObjectClass(env, obj)获得类class对象。

然后通过GetStaticMethodID(env, clazz, name, sig) 和 CallStaticVoidMethod(env, clazz, methodID, args) 调用static方法。

2. jni回调非静态方法

JNIEXPORT jstring JNICALL Java_com_dj_jni_jnimodule_NativeHelper_getStringFromJni

(JNIEnv *env, jobject obj){

jclass cls = (*env)->GetObjectClass(env, obj);

jmethodID callback = (*env)->GetMethodID(env, cls, "printHelloWorld", "()V");

(*env)->CallVoidMethod(env, obj, callback);

return (*env)->NewStringUTF(env,"Hello from JNI !");

}

回调非静态方法通过GetMethodID(env, clazz, name, sig) 和 CallVoidMethod (env,obj, methodID, args)调用。

注意:

CallVoidMethod(env, obj, methodID, args)的第二个参数obj是类的实例。需要传入类实例化后的对象。

其对应的java代码的方式是:

NativeHelper nativeHelper = new NativeHelper();

nativeHelper.printHelloWorld();

CallStaticVoidMethod(env, clazz, methodID, args)的第二个参数clazz是类的class实例。需要传入类class对象。

JNIEnv可以通过以下几种方式获取类class对象,即jclass:

jclass FindClass(const char* clsName) 根据类名来查找一个类,完整类名。

jclass GetObjectClass(jobject obj) 根据一个对象,获取该对象的类

jclass GetSuperClass(jclass obj) 获取一个类的父类

其对应的java代码的方式是:

NativeHelper.printStaticHelloWorld();

注意无论GetStaticMethodID(env, clazz, name, sig) 和GetMethodID(env, clazz, name, sig),其第二个参数clazz都是类的class实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值