NDK学习之------静态注册--c层调用java层方法

2020-04-16

  • c层调用java层的普通函数和静态函数

  1. 在布局文件中新增两个按钮
        <Button
            android:id="@+id/btn_call_normal_method"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="调用普通方法" />
        <Button
            android:id="@+id/btn_call_static_method"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="调用静态方法" />
  2. 修改MainActivity.java中点击事件处理
    //在onCreate函数中添加注册事件处理函数
    ((Button)findViewById(R.id.btn_call_normal_method)).setOnClickListener(mOnClickListener);
    		((Button)findViewById(R.id.btn_call_static_method)).setOnClickListener(mOnClickListener);
    
    //然后创建事件处理的mOnClickListener
    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
    		
    		@Override
    		public void onClick(View v) {
    			// TODO Auto-generated method stub
    			switch (v.getId()) {
    			case R.id.btn_click:
    				setString();
    				break;
    			case R.id.btn_show:
    				showNormalAndStaticString();
    				break;
    			case R.id.btn_call_normal_method:
    				callNormalMethod();
    				break;
    			case R.id.btn_call_static_method:
    				String result = callStaticMethod();
    				Toast.makeText(MainActivity.this, "调用结果:"+result, 2000).show();
    				break;
    
    			default:
    				break;
    			}
    		}
    	};

     

  3. 创建两个native函数,
    //jni层调用普通函数
    	public native void callNormalMethod();
    	//jni层调用静态函数
    	public native String callStaticMethod();

     

  4. 创建两个函数,用于被jni层调用
    	public void normalMethod() {
    		Toast.makeText(this, "我是普通方法", 2000).show();
    	}
    	public static void staticMethod() {
    		Toast.makeText(mThis, "我是静态方法", 2000).show();
    	}

     

  5. 为了能够在staticMethod函数中使用context,这里需要申明一个静态的mThis,在onCreate中赋值this
    private static MainActivity mThis = null;
    
    //在onCreate函数中
    @Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		Toast.makeText(this, getString(), Toast.LENGTH_SHORT).show();
    		mThis = this;
    		//设置变量的数值
    		((Button)findViewById(R.id.btn_click)).setOnClickListener(mOnClickListener);
    		((Button)findViewById(R.id.btn_show)).setOnClickListener(mOnClickListener);
    		((Button)findViewById(R.id.btn_call_normal_method)).setOnClickListener(mOnClickListener);
    		((Button)findViewById(R.id.btn_call_static_method)).setOnClickListener(mOnClickListener);
    	}

     

  6. 在jni层,修改jni_study.h,添加两个native函数的申明
    JNIEXPORT void JNICALL Java_com_ldj_leanndk001_MainActivity_callNormalMethod
    	(JNIEnv *, jobject);
    JNIEXPORT jstring JNICALL Java_com_ldj_leanndk001_MainActivity_callStaticMethod
    	(JNIEnv *, jobject);

     

  7. 修改jni_study.c文件
    //调用普通方法
    JNIEXPORT void JNICALL Java_com_ldj_leanndk001_MainActivity_callNormalMethod(JNIEnv * env, jobject obj){
    	//首先获取class
    	//jclass      (*FindClass)(JNIEnv*, const char*);
    	jclass  clazz_main = (*env)->FindClass(env,"com/ldj/leanndk001/MainActivity");
    	//判断clazz_main是否存在
    	if ( !clazz_main ) {
    		LOGD("clazz_main not existed");
    		return;
    	}
    	//然后获取需要调用的methidid
    	//jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    	jmethodID normalMethod = (*env)->GetMethodID(env,clazz_main,"normalMethod","()V");
    	//调用方法
    	// void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
    	(*env)->CallVoidMethod(env,obj,normalMethod);
    
    }
    //调用静态方法
    JNIEXPORT jstring JNICALL Java_com_ldj_leanndk001_MainActivity_callStaticMethod(JNIEnv * env, jobject obj){
    	//首先获取class
    	//jclass      (*FindClass)(JNIEnv*, const char*);
    	jclass  clazz_main = (*env)->FindClass(env,"com/ldj/leanndk001/MainActivity");
    	//判断clazz_main是否存在
    	if ( !clazz_main ) {
    		LOGD("clazz_main not existed");
    		return (*env)->NewStringUTF(env,"clazz_main not existed");
    	}
    	//然后获取需要调用的methidid
    	//jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
    	jmethodID staticMethod = (*env)->GetStaticMethodID(env,clazz_main,"staticMethod","()V");
    	//调用方法
    	//  void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
    	(*env)->CallStaticVoidMethod(env,clazz_main,staticMethod);
    
    	jstring result = (*env)->NewStringUTF(env,"callStaticMethod_called");
    	return result;
    }
    

     

  8. 然后编译,安装,运行结果如下:
  9. 本次学习的内容主要是jni层如何调用java层函数,方法还是先类->找方法->调用方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值