JNI函数命名规则及分析
2017-10-9
1.函数的命名规则
Java_类的全路径(.用_代替)_方法名。例如:Java_com_linuxpara_ndkdemo_NativeUtil_printCString
2.使用javah生成头文件
-
创建NativeUtil类,添加printCString方法
public class NativeUtil { static { System.loadLibrary("native-util"); } public native void printCString(); } - 进入java目录:
cd app/src/main/java - 生成头文件:
javah com.linuxpara.ndkdemo.NativeUtil
3.javah命令解释
选项 | 描述
————- | ————-
-o <file> | 输出文件 (只能使用 -d 或 -o 之一)
-d <dir> | 输出目录
-v. | 启用详细输出
-encoding | 指定文件编码
4.头文件内容
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_linuxpara_ndkstudy_NativeUtil */
#ifndef _Included_com_linuxpara_ndkdemo_NativeUtil
#define _Included_com_linuxpara_ndkdemo_NativeUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_linuxpara_ndkdemo_NativeUtil
* Method: printCString
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_linuxpara_ndkdemo_NativeUtil_printCString
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
5.头文件实现内容
//1. JNIEXPORT Windows中编译dll动态库规定,如果动态库中的函数要被外部调用,
需要在函数声明中添加__declspec(dllexport)标识,表示将该函数导出在外部可以调用。
//2. JNICALL 在windows中的值为__stdcall,用于约束函数入栈顺序和堆栈清理的规则。
//Linux中两个宏定义的值为空。
JNIEXPORT void JNICALL Java_com_linuxpara_ndkstudy_NativeUtil_printCString
(JNIEnv *env, jobject jobj){
//3. JNIEnv=结构体JNINativeInterface的指针,JNINativeInterface包含了一些API函数指针。
//4. jobject代表了java方法对应的对象,如果是static方法代表java方法对应的class。
jstring str = env->NewStringUTF("Hello JNI!");
__android_log_print(ANDROID_LOG_INFO,TAG,"%s",str);
}