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