JNI函数命名规则及分析

2017-10-9

1.函数的命名规则

Java_类的全路径(.用_代替)_方法名。例如:Java_com_linuxpara_ndkdemo_NativeUtil_printCString

2.使用javah生成头文件

  1. 创建NativeUtil类,添加printCString方法

     public class NativeUtil {
         static {
             System.loadLibrary("native-util");
         }
         public native void printCString();
     }
    
  2. 进入java目录:cd app/src/main/java
  3. 生成头文件: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);
}

描述

这是一个私人博客,记录平时的一些技术积累。

关于我

Email: 13073134757@163.com
GitHub: LinuxparaChen
© 主题借鉴Papyrus 原著作者:Hugo Sereno Ferreira. 原著主题.
Modify by LinuxparaChen.