JNI由浅入深_7_c调用Java方法一
1、在Java中声明方法
<span style="font-size:14px;">/** * javah -encoding utf-8 -jni com.example.jniandroid.service.CFunction * 当java中有中文时,会报编码GBK不可映射字符 方法的调用,加上-encoding utf-8 * * @author libin * */ public class CFunction { /** * 实现在c里面回调callback方法 */ public native void callJniNative(); /** * c调用Java的实例方法 */ public void callback() { System.out.println("callNative to callback in Java"); } /** * c调用Java的静态方法 */ public static void callbackStatic() { System.out.println("callNative to callback static in Java"); } }</span>
2、c中调用Java方法
2.1 调用实例方法
本地方法Java_InstanceMethodCall_nativeMethod的实现演示了在本地代码中调用JAVA方法的两步:
1、本地方法首先调用JNI函数GetMethodID。这个函数在指定的类中寻找相应的方法。这个寻找过程是基于方法描述符的。如果方法不存在,GetMethodID返回NULL。这时,立即从本地方法中返回,并引发一个NoSuchMethodError错误。
2、 本地方法通过调用CallVoidMethod来调用返回值为void的实例方法。
除了CallVoidMethod这个函数以外,JNI也支持对返回值为其它类型的方法的调用。如果你调用的方法返回值类型为int,你的本地方法会使用CallIntMethod。类似地,你可以调用CallObjectMethod来调用返回值为java.lang.String、数组等对象类型的方法。
2.2 调用静态方法
静态方法调用功能的JNI系列函数中的一个,如:CallStaticVoidMethod,CallStaticBooleanMethod等。
调用静态方法和调用实例方法的JNI函数有一个很大的不同,前者第二个参数是类引用,后者是对象实例的引用。
在JAVA访问一个静态方法可以通过类,也可以通过对象实例。而JNI的规定是,在本地代码中回调JAVA中的静态方法时,必须指定一个类引用才行。<span style="font-size:14px;">/** * 调用Java的静态方法和实例方法 */ JNIEXPORT void JNICALL Java_com_example_jniandroid_service_CFunction_callJniNative( JNIEnv * env, jobject obj) { //调用静态方法 jclass cls = (*env)->GetObjectClass(env, obj); jmethodID callbackStatic = (*env)->GetStaticMethodID(env, cls, "callbackStatic", "()V"); (*env)->CallStaticVoidMethod(env, cls, callbackStatic); //调用实例方法,先要创建一个对象,然后通过Call<Type>Method方法进行调用 jclass instanceFunc = (*env)->FindClass(env, "com/example/jniandroid/service/CFunction"); jmethodID construction_id = (*env)->GetMethodID(env, instanceFunc, "<init>","()V"); jclass mCFunction = (*env)->NewObject(env, instanceFunc, construction_id); jmethodID callback = (*env)->GetMethodID(env,instanceFunc,"callback","()V"); (*env)->CallVoidMethod(env, mCFunction, callback); }</span>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。