jnijni入门


备注

本节概述了jni是什么,以及开发人员可能想要使用它的原因。

它还应该提到jni中的任何大型主题,并链接到相关主题。由于jni的文档是新的,您可能需要创建这些相关主题的初始版本。

JNI入门

JNI表示Java Native Interface。它是一种如何从在JVM控制下运行的Java应用程序调用本机代码的机制,反之亦然。本机代码表示为目标平台编译的代码。本机代码通常用C或C ++编写,但它可以用任何具有目标平台编译器的语言编写。

JNI非常有用

  • Java应用程序需要访问特定于平台的资源,并且没有具有所需功能的Java库。资源可以是特定的硬件,传感器或其他。
  • Java应用程序必须执行性能关键任务,本机代码可能比java字节码更快或占用空间更少。尽管如此,确实过于自信JVM能够进行大量的优化,而C / C ++中的天真实现可能会更慢。
  • C / C ++(或其他语言)中的应用程序想要使用java库中提供的功能。

从JNI开始,您需要

  • JDK或能够将java编译为字节码的东西。
  • 用于编译本机代码的编译器。

以下hello world示例是一个调用C函数的简单Java应用程序。该示例可以由javac从JDK和gcc C编译器编译。

Java代码:

public class JNIExample {

    public static void main(String[] args) {
       // The loadLibrary search for the native library (libnative.so in this case)
       System.loadLibrary("native");
       String s = "Hello JNI";
       JNIExample example = new JNIExample();
       example.doPrint(s);
   }

   // The method with native code (written in C) must be declared with native prefix
   public native void doPrint(String message);

}
 

C代码:

#include <jni.h>
#include <stdio.h>

/* the function that is called from java must be declered with decorators
 * JNIEXPORT and JNICALL.
 * The function name is constructed as Java_ClassName_MethodName
 * Function parameters correspond parameters in java but there are 2 extra parameters
 * JNIEnv is a pointer to java envoronmet and jobject is a reference to caller object.
 * Caller object is the instance of the JNIExample in this case.
 */
JNIEXPORT void JNICALL Java_JNIExample_doPrint(JNIEnv *e, jobject obj, jstring message) {
    const char *c_message;
    /* It is necessary to convert java objects like string to something C native */
    c_message = (*e)->GetStringUTFChars(e, message, NULL);
    printf("%s\n", c_message);
    /* in the end it is necessary to free resources allocated by Get above */
    (*e)->ReleaseStringUTFChars(e, message, c_message);
}