Android Jni反射Java方法,弹出对话框
来源:互联网 发布:华讯网络北京怎么样 编辑:程序博客网 时间:2024/06/06 04:05
1、创建页面
/** * @描述 C语言调用java反射方法 * @项目名称 App_imooc * @包名 com.android.imooc.jni * @类名 ReflectActivity * @author chenlin * @date 2012年6月9日 上午8:49:35 */public class ReflectActivity extends Activity { static{ System.loadLibrary("hello"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_jni_reflect); } public void reflect(View view){ showFromC(); } public void show(String msg){ AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("反射方法调用"); builder.setMessage(msg); builder.show(); } public native void showFromC();}
2、在Hello.c里创建方法
JNIEXPORT void Java_com_android_imooc_jni_ReflectActivity_logFromC(JNIEnv* env, jobject obj) {
}
3、获得java里 show方法的签名
1)首先进入到项目的classes目录 E:\androidproject\App_imooc\bin\classes
2)右键+shift打开窗口, 如图:
3)点击“在此处打开命令窗口”
4)输入E:\androidproject\App_imooc\bin\classes> javap -s com.android.imooc.jni.ReflectAc
tivity
5)得到签名: (Ljava/lang/String;)V
4、在C方法里先得到反编译类
//拿到字节吗jclass clazz = ( *env)->FindClass(env, "com/android/imooc/jni/ReflectActivity");
//得到方法名称( *env)->GetMethodID(env, clazz, "show", "(Ljava/lang/String;)V");
//把C字符串转化为java字符串jstring str = (*env)->NewStringUTF(env,"hello world");//调用回调方法( *env)->CallVoidMethod(env, obj, id, str);
5、Hello.c完整代码
JNIEXPORT void JNICALL Java_com_android_imooc_jni_ReflectActivity_showFromC(JNIEnv* env, jobject obj) { //拿到字节吗 jclass clazz = ( *env)->FindClass(env, "com/android/imooc/jni/ReflectActivity"); //获得方法id //jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*); jmethodID id = ( *env)->GetMethodID(env, clazz, "show", "(Ljava/lang/String;)V"); //回调 //void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); jstring str = (*env)->NewStringUTF(env,"hello world"); ( *env)->CallVoidMethod(env, obj, id, str);}
6、最后调用成后的效果:
7、注意,如果是中文,小心乱码问题,解决办法:
右键hello.c文件–》属性–》选择UTF-8编码
8、Java自身反射简单示例:
package com.java.basic.reflect;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * @描述 TODO * @项目名称 Javas * @包名 com.java.basic.reflect * @类名 SimpleDemo * @author chenlin * @date 2009年11月9日 上午8:41:48 */public class SimpleDemo { public void show(String str){ System.out.println(str); } public void reflect(){ try { Class clazz = SimpleDemo.class.getClassLoader().loadClass("com.java.basic.reflect.SimpleDemo"); Method method = clazz.getDeclaredMethod("show", String.class); method.invoke(clazz.newInstance(), "hello world"); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { SimpleDemo demo = new SimpleDemo(); demo.reflect(); }}
1 0
- Android Jni反射Java方法,弹出对话框
- Android JNI反射调用Java构造方法、成员方法和静态方法
- Java方法签名与JNI,反射
- android 弹出进度条对话框的方法
- android 弹出进度条对话框的方法
- asp弹出对话框方法
- Qt 弹出对话框方法
- android 弹出对话框 弹出自定义对话框
- android弹出对话框
- Android 弹出对话框Dialog
- Android 弹出对话框Dialog
- Android弹出自定义对话框
- android弹出对话框
- android弹出对话框
- Android-PopupWindow弹出对话框
- android普通弹出对话框
- Android popupwindow弹出对话框
- Android弹出对话框实例
- zynq ALSA
- DataReader与DataSet
- C#日记——委托
- Java Android开发小知识
- zookeeper入门-整理版
- Android Jni反射Java方法,弹出对话框
- numpy相关性分析
- linux 下wine 和plyaonlinux 安装以及卸载 (linux下运行windows软件的神器)
- [AngularJS面面观] 8. scope继承 - 属性覆盖,隔离scope以及指定scope的parent
- kali wbpy
- [从头读历史] 第247节 夏商与西周时期的全面解读
- 自动装拆箱
- zigbee协议栈应用(三)无线收发控制LED与串口使用
- hdu1198bfs