现在的位置: 首页 > 综合 > 正文

android NDK学习篇5之hello-jni——jni中头文件的自动生成

2013年12月09日 ⁄ 综合 ⁄ 共 1721字 ⁄ 字号 评论关闭

在NDK自带的samples项目中,jni目录下都没有.c/cpp的头文件,而是直接遵循方法命名规则。如hello-jni.c文件,

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )

直接是Java_java本地方法所在包名(用下划线_取代点.连起来)_方法名(两个固定参数,java传入的其他参数);

其中JNIEnv *env :

就是JNI运行环境,通过它才能与java层交互。JNIEnv指针是JVM创建的,用于Native的c/c++方法操纵Java执行栈中的数据,比如Java Class, Java Method等。

jobject thiz或者jclass class:

就是指当前操作的数据来源的对象,当是静态方法时,则指这个类。

具体参考这个:

http://blog.csdn.net/wantianpei/article/details/7638328

回到主题上来,上面只是表明没有.h文件,只要按照jni命名规则,java调用C方法也是没有问题的。在hello-jni工程中要生产jni头文件,需要用到javah这个工具。先看看它的帮助说明:

用法:javah [选项] <类>

其中 [选项] 包括:

	-help                 输出此帮助消息并退出
	-classpath <路径>     用于装入类的路径
	-bootclasspath <路径> 用于装入引导类的路径
	-d <目录>             输出目录
	-o <文件>             输出文件(只能使用 -d 或 -o 中的一个)
	-jni                  生成 JNI样式的头文件(默认)
	-version              输出版本信息
	-verbose              启用详细输出
	-force		      始终写入输出文件

使用全限定名称指定 <类>(例
如,java.lang.Object)。

一般用法是转到android项目bin/classes目录下,然后执行:

javah -classpath ./ -d ../../jni -jni  com.example.hellojni.HelloJni

个人习惯直接用:

在项目根目录下,直接执行:

javah -classpath ./bin/classes -d ./jni -jni com.example.hellojni.HelloJni这种风格。

执行后会在项目目录下生产jni文件夹,里面存放着自动生产的.h文件com_example_hellojni_HelloJni.h;

内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_hellojni_HelloJni */

#ifndef _Included_com_example_hellojni_HelloJni
#define _Included_com_example_hellojni_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_hellojni_HelloJni
 * Method:    stringFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI
  (JNIEnv *, jobject);

/*
 * Class:     com_example_hellojni_HelloJni
 * Method:    unimplementedStringFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_unimplementedStringFromJNI
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

include此头文件,然后编写C实现代码。

参考资料:

http://book.51cto.com/art/201305/395882.htm


【上篇】
【下篇】

抱歉!评论已关闭.