(转载)JNI由浅入深_7_c调用Java方法一

(转载)https://www.cnblogs.com/lbangel/p/4335860.html

1、在Java中声明方法

 

/**
 * 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");
	}

}

 

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中的静态方法时,必须指定一个类引用才行。

 

/**
 * 调用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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值