★03.一个简单的Native方法

Prompt.java

public class Prompt {
    static {
        System.loadLibrary("Prompt");
    }

    public static void main(String[] args) {
        Prompt p = new Prompt();
        String input = p.getLine("Type a line: ");
        System.out.println("User typed: " + input);
    }

    private native String getLine(String prompt);
}

Prompt.c

#include 

#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Prompt
 * Method:    getLine
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv * env, jobject obj, jstring str) {
}

#ifdef __cplusplus
}
#endif

解说

  • 原生函数总是比Java中声明的方法多两个参数。
  • 第一个参数:JNIEnv *类型,是 JNIEnv 接口指针,指向一个地址,该地址包含了指向函数表的指针。
  • 第二个参数:根据原生函数是否是 静态函数 而有所不同。
    1. 如果该原生函数不是 静态函数 ,则是jobject,对应着调用该原生函数的 Java 对象,有点像 C++ 中的this指针。
    2. 如果该原生函数是 静态函数 ,则是jclass,对应着调用该原生函数的 Java 类。

类型映射

  • boolean - jboolean
  • char - jchar
  • short - jshort
  • int - jint
  • long - jlong
  • float - jfloat
  • double - jdouble

其他

  • 所有的 JNI 引用都是jobject类型。

你可能感兴趣的:(★03.一个简单的Native方法)