JNI由浅入深_7_c调用Java方法一
发表时间:2020-10-19
发布人:葵宇科技
浏览次数:42
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>