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();
}
}
效果图:
点击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();
}
}
效果图:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories