JNI 开发流程
1.编写native 方法
2.javah 命令,生成.h 文件
java_类的全名_方法名
或者自己手写
3.复制.h 头文件到cpp 工程
4.复制jni.h 和jni_md.h
5.实现.h 头文件中的声明函数
6.生成一个dll 动态库
7.在java中加载动态库
8.触发native函数
2.javah 命令,生成.h 文件
java_类的全名_方法名
或者自己手写
3.复制.h 头文件到cpp 工程
4.复制jni.h 和jni_md.h
5.实现.h 头文件中的声明函数
6.生成一个dll 动态库
7.在java中加载动态库
8.触发native函数
静态注册:
(1)编写native方法
public class FileUtils {
public native static void diff(String path, String pattern_Path, int file_num);
public native static String getString();
public native String getNoStaticString();
public String key= "key";
public native String accessField();
/**
* 通过 这个方法来触发,jni 调用
* getRandeomUUId 这个静态方法
*/
public native void getStaticString();
//访问构造方法
public native Date acceessConstructor();
//访问构造方法
public native String getStudentName();
// 中文的处理
public native String chineseChars(String str);
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
}
(2)生成.h文件
#include <jni.h>
/* Header for class com_zack_banner_FileUtils */
#ifndef _Included_com_zack_banner_FileUtils
#define _Included_com_zack_banner_FileUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_zack_banner_FileUtils
* Method: diff
* Signature: (Ljava/lang/String;Ljava/lang/String;I)V
*/
JNIEXPORT void JNICALL Java_com_zack_banner_FileUtils_diff
(JNIEnv *, jclass, jstring, jstring, jint);
#ifdef __cplusplus
}
#endif
#endif
/* Header for class com_zack_banner_FileUtils */
#ifndef _Included_com_zack_banner_FileUtils
#define _Included_com_zack_banner_FileUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_zack_banner_FileUtils
* Method: diff
* Signature: (Ljava/lang/String;Ljava/lang/String;I)V
*/
JNIEXPORT void JNICALL Java_com_zack_banner_FileUtils_diff
(JNIEnv *, jclass, jstring, jstring, jint);
#ifdef __cplusplus
}
#endif
#endif
(3)静态注册的c方法
JNIEXPORT void JNICALL Java_com_zack_banner_FileUtils_diff
(JNIEnv *, jclass, jstring, jstring, jint)
(JNIEnv *, jclass, jstring, jstring, jint)
{
}
(4)动态注册
/*,
{
"getString","()Ljava/langString;",(void*)native_java_str
}*/
static const JNINativeMethod getMethod[]= {
{
"diff", "(Ljava/lang/String;Ljava/lang/String;I)V", (void *) native_zack_diff
}
,{
"getString","()Ljava/lang/String;",(void*)native_java_str
}
,{
"getNoStaticString","()Ljava/lang/String;",(void*)native_no_static
},
{
"accessField","()Ljava/lang/String;",(void*)change_zack_key
},
{
"chineseChars","(Ljava/lang/String;)Ljava/lang/String;",(void*)getchineseChars
},
{
"acceessConstructor","()Ljava/util/Date;",(void*)zack_getDate
},
{
"getStudentName","()Ljava/lang/String;",(void*)zack_getStudentName
}
};
static int registerNatives(JNIEnv* engv)
{
LOGI("registerNatives begin");
jclass clazz;
clazz = (*engv) -> FindClass(engv, "com/zack/banner/FileUtils");
if (clazz == NULL) {
LOGI("clazz is null");
return JNI_FALSE;
}
if ((*engv) ->RegisterNatives(engv, clazz, getMethod, NELEM(getMethod)) < 0) {
LOGI("RegisterNatives error");
return JNI_FALSE;
}
return JNI_TRUE;
}
//JNI_OnLoad
JNIEXPORT jint JNI_OnLoad(JavaVM *vm,void* reserved){
LOGI("jni_OnLoad begin");
JNIEnv* env = NULL;
if ((*vm)->GetEnv(vm,(void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGI("ERROR: GetEnv failed\n");
return -1;
}
assert(env != NULL);
registerNatives(env);
return JNI_VERSION_1_4;
}
(5)触发
public class MainActivity extends AppCompatActivity {
private String TAG="zack";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
diff();
TextView tvTest= (TextView) findViewById(R.id.tv_test);
FileUtils fileUtils=new FileUtils();
StringBuffer stb=new StringBuffer();
stb.append(FileUtils.getString()).append("\n");
stb.append(fileUtils.getNoStaticString()).append("\n");
stb.append("change before key: " + fileUtils.key).append("\n");
fileUtils.accessField();
stb.append("after change, Key: " + fileUtils.key).append("\n");
stb.append(fileUtils.acceessConstructor()).append("\n");
stb.append(fileUtils.getStudentName());
tvTest.setText(stb);
System.out.println(fileUtils.chineseChars("她的背影"));
// fileUtils.accessField();
// System.out.println("after change, Key: " + fileUtils.key);
}
public void diff() {
Log.d(TAG, "diff begin");
FileUtils.diff("x","s",3);
}
}
private String TAG="zack";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
diff();
TextView tvTest= (TextView) findViewById(R.id.tv_test);
FileUtils fileUtils=new FileUtils();
StringBuffer stb=new StringBuffer();
stb.append(FileUtils.getString()).append("\n");
stb.append(fileUtils.getNoStaticString()).append("\n");
stb.append("change before key: " + fileUtils.key).append("\n");
fileUtils.accessField();
stb.append("after change, Key: " + fileUtils.key).append("\n");
stb.append(fileUtils.acceessConstructor()).append("\n");
stb.append(fileUtils.getStudentName());
tvTest.setText(stb);
System.out.println(fileUtils.chineseChars("她的背影"));
// fileUtils.accessField();
// System.out.println("after change, Key: " + fileUtils.key);
}
public void diff() {
Log.d(TAG, "diff begin");
FileUtils.diff("x","s",3);
}
}
下载链接 (eclipse android stuido 都有)
http://download.csdn.net/download/xue9052zhou/9932116