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








