您的位置:首页 > 移动开发 > Android开发

Android-本地方法C调用Java中的方法/NDK-JNI开发实例(六)

2015-09-01 21:48 996 查看
流程:

 点击button按钮调用本地方法,本地方法中使用C调用Java中的show()方法;

生成方法的签名:

打印方法签名

项目名-->app-->build-->intermediates-->classes-->debug目录下; javap -s 包名.类名     (classes文件夹要先编译才能出来)



android31.c

<span style="font-family:KaiTi_GB2312;font-size:18px;">//
// Created by yu_longji on 2015/9/1.
//
#include <jni.h>

JNIEXPORT void JNICALL Java_com_example_yu_1longji_android31_MainActivity_CtoJavaFun
(JNIEnv *env, jobject obj) {
//通过反射获取该类
//jclass (*FindClass)(JNIEnv*, const char*);
jclass clazz = (*env)->FindClass(env, "com/example/yu_longji/android31/MainActivity");
//通过签名获取该方法的id
//jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID methodID = (*env)->GetMethodID(env, clazz, "show", "(Ljava/lang/String;)V");
//调用该方法
//void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env, obj, methodID, (*env)->NewStringUTF(env, "这是C调用Java中的show方法"));
}
</span>
生成的方法名:

/*
* Class: com_example_yu_longji_android31_MainActivity
* Method: CtoJavaFun
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_yu_1longji_android31_MainActivity_CtoJavaFun
(JNIEnv *, jobject);

布局文件:

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<Button
android:textSize="30sp"
android:onClick="click"
android:text="调用C方法"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>

MainActivity.java
package com.example.yu_longji.android31;

import android.app.Activity;

import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

static {
System.loadLibrary("Android31");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void click(View view) {
CtoJavaFun();
}

public native void CtoJavaFun();

public void show(String message) {
//弹出对话框
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("标题");
builder.setMessage(message);
builder.show();

}

}


效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息