1.创建一个工程
2.在设置-workspace中设置UTF-8
3.在设置-Android-NDK中,添加ndk工具开发
4.添加native依赖,选中项目名-Android Tools-art native support,命名一下,如(hehe),会生成jni目录
5.写一个显示c++代码里面返回的字符串
6.//写一个Button按钮
public void cppReflectAccessField(View view){
//此处调用接口方法使用
getNativeText();
}
7.写一个native接口方法
//例子是返回值是String类型
public native void nativeCppReflectAccessField();
8.在项目文件夹根目录app下,打开命令行,输入
javah -d..\jni cn.android.hellojni.MainActivity//全类名
9.回到项目刷新一下,会多一个.h文件
10.在.cpp文件中,写入
#include "cn_android_hellojni_MainActivity.h"
11-1.在.cpp文件中,实现 字段
//反射访问Java里面的字段
JNIEXPORT void JNICALL java_cn_android_hellojni_MainActivity_nativeCppReflectAccessField//此处nativeCppReflectAccessField为步骤 7 中的接口方法;
(JNIEnv * env,jobject jo){//JNIEnv * 代表指针,指针:指向内存的地址;
//获取类的定义
jclass clazz = env->GetObjectClass(jo);
//获取字段的定义
jfieldID field = env->GetFieldID(clazz,"mInt","I");//类的定义,字段的定义,整型的字段,签名是I
//获取字段值
jint value = env->GetIntField(jo,field);
//打印日志
这里注意:1、需要在本类上面添加
#include <stdio.h>
2、使用sprintf来获取字符串
char msg[100];
sprintf(msg,"C++反射获取的mInt:%d",value);
_android_log_write(ANDROID_LOG_INFO,"MainActivity的test",msg);
}
11-1.在.cpp文件中,实现方法
//反射访问Java里面的方法
JNIEXPORT void JNICALL java_cn_android_hellojni_MainActivity_nativeCppReflectAccessField//此处nativeCppReflectAccessField为步骤 7 中的接口方法;
(JNIEnv * env,jobject jo){//JNIEnv * 代表指针,指针:指向内存的地址;
//获取类的定义
jclass clazz = env->GetObjectClass(jo);
//获取方法的定义
jmethodID method = env->GetMethodID(clazz,"fangfaming","(Ljava.lang.String;)V");//类的定义,方法的定义,方法的签名,可通过在项目文件夹根目录app下,打开命令行,输入javap -s -p cn.android.jnihello.MainActivity获取
//调用方法 //打印日志
jint value = env->CallVoidMethod(jo,method,env->NewStringUTF("C++帮我打日志"));
}