Android 下 JNI 开发Day2
04_javah 生成头文件-15
1_采用这个方法(**env).NewStringUTF(env,text)
只要改动C代码都需要重新编译,Java地方不需要改变。
2_修改Java中的方法名
public native String hello_From_C();
C语言中也需要修改成
jstring Java_com_atguigu_jnihelloworld_MainActivity_hello_From_C(JNIEnv* env,jobject obj){
// jstring (*NewStringUTF)(JNIEnv*, const char*);
char* text = "I am from C helle afu 123";
return (**env).NewStringUTF(env,text);
//return (*env)->NewStringUTF(env,text);
}
编译运行会报错
如果java方法中有下划线,需要在C代码方法下划线后面追加1
解决方案:在修改c代码如下:加1
jstring Java_com_atguigu_jnihelloworld_MainActivity_hello_1From_1C(JNIEnv* env,jobject obj){
// jstring (*NewStringUTF)(JNIEnv*, const char*);
char* text = "I am from C helle afu 123";
return (**env).NewStringUTF(env,text);
//return (*env)->NewStringUTF(env,text);
}
如果写成这样是不是很麻烦
public native String hello_111_2_5_hehe_From_C();
3.在当前控制台输入javah命令
4_进入到源码目录下执行命令
D:\jni_workspace\JNIHelloWorld\bin\classes>
执行命令:javah com.atguigu.jnihellworld.MainActvity
或者:com.atguigu.jnihellworld.MainActvity
执行后生成文件:com_atguigu_jnihelloworld_MainActivity.h如图
文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_atguigu_jnihelloworld_MainActivity */
#ifndef _Included_com_atguigu_jnihelloworld_MainActivity
#define _Included_com_atguigu_jnihelloworld_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_atguigu_jnihelloworld_MainActivity
* Method: hello_111_2_5_hehe_From_C
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_atguigu_jnihelloworld_MainActivity_hello_1111_12_15_1hehe_1From_1C
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
5_拷贝com_atguigu_jnihelloworld_MainActivity.h到工程jni目录;
6_创建一个新的文件Hello2.c,把生成的方法拷贝过来内容如下:
#include<stdio.h>
#include<stdlib.h>
#include<jni.h>//这个头文件必须得有。里面包含jni对应的方法和类型;
JNIEXPORT jstring JNICALL Java_com_atguigu_jnihelloworld_MainActivity_hello_1111_12_15_1hehe_1From_1C
(JNIEnv *env, jobject obj){
char* text = "I am from c hello afu hello2.c";
return (*env)->NewStringUTF(env,text);
}
7_修改Android.mk文件引用成Hello2.c
LOCAL_SRC_FILES := Hello2.c
注意: 不同版本的JDK操作方式不同.
命令: javah <包名+类名>
JDK1.6使用方式
在当前工程的bin/classes目录下, 执行javah命令.
JDK1.7使用方式
在工程的src目录下, 执行javah命令.
javah cn.atguigu.ndk2.DemoActivity