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
原创粉丝点击