JNI由浅入深_7_c调用Java方法一 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

JNI由浅入深_7_c调用Java方法一

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:28

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>

相关案例查看更多