当我们需要使用Java与其他语言(如C/C++)交互时,便需要使用到Java Native Interface(JNI)技术。这篇文章将分享如何在Java中使用JNI,并提供两个具体的示例说明。
JNI的概述
Java Native Interface(JNI)是Java语言中用于与本地代码(例如C、C++)进行交互的一种机制。使用JNI,我们可以在Java程序中调用C或C++代码,或者让C或C++代码调用Java程序中的方法。了解JNI的概述,是使用JNI的必经之路。
JNI的安装与配置
在Linux系统下使用JNI,需要安装Java JDK(Java Developer Kit)。在JDK的安装目录下,会包含Java Native Interface的头文件和库文件。
例如,在Ubuntu系统下,我们可以通过以下命令安装JDK:
sudo apt install default-jdk
然后,我们需要设置以下环境变量:
export JAVA_HOME=/usr/lib/jvm/default-java
export PATH=$JAVA_HOME/bin:$PATH
JNI的使用
在Java代码中使用JNI,需要native关键字来声明被native方法的Java函数(即为本地方法),这样,该Java函数将在本地库中实现。并且,在Java函数中通过System.loadLibrary()来加载本地库。此外,我们需要编写本地库代码,并利用JNI提供的函数接口实现Java函数调用本地库代码。
以下是一个简单示例,实现了Java程序调用本地库中的hello()方法,输出"Hello, World!"。
Java代码:
public class HelloWorld {
public static native void hello();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
hello();
}
}
C代码:
#include <stdio.h>
#include <jni.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env, jclass cls) {
printf("Hello, World!\n");
}
我们需要通过JNI提供的函数接口在C代码中实现Java函数hello()。在这个示例中,我们使用printf函数将“Hello, World!”输出到控制台。
在使用这个示例时,我们需要新建Java文件HelloWorld.java,并通过javac对其进行编译:
javac HelloWorld.java
然后,我们需要通过javah命令生成C文件的头文件:
javah -jni HelloWorld
这个命令将生成头文件HelloWorld.h。我们需要使用这个头文件来编写C源代码。
然后,我们用gcc编译C文件:
gcc -shared -fpic -o libhello.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux HelloWorld.c
这个命令将生成名为libhello.so的本地库文件。
最后,我们运行HelloWorld程序:
java HelloWorld
JNI在C++中的使用
JNI同样可以在C++中使用。相比于C语言来说,C++的优势在于可以更好的支持面向对象的编程。
以下是一个使用C++的示例:
Java代码:
public class Calc {
public static native int add(int a, int b);
public static native int sub(int a, int b);
static {
System.loadLibrary("calc");
}
public static void main(String[] args) {
System.out.println("3 + 2 = " + add(3, 2));
System.out.println("3 - 2 = " + sub(3, 2));
}
}
C++代码:
#include <stdio.h>
#include <jni.h>
JNIEXPORT jint JNICALL Java_Calc_add(JNIEnv *env, jclass, jint a, jint b) {
return a + b;
}
JNIEXPORT jint JNICALL Java_Calc_sub(JNIEnv *env, jclass, jint a, jint b) {
return a - b;
}
在这个示例中,我们使用C++编写了函数add()和sub()。需要注意的是,我们需要在C++文件中使用extern "C"关键字来指定函数名使用C声明规则。在这个示例中,我们使用了C++11标准中的lambda表达式来实现Java函数调用C++函数add()和sub()。
同样地,我们需要通过javac命令编译Java程序:
javac Calc.java
使用javah命令生成头文件Calc.h:
javah -jni Calc
最后使用g++命令编译C++文件:
g++ -shared -fpic -std=c++11 -o libcalc.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux Calc.cpp
最后,我们可以使用Java命令运行程序:
java Calc
结论
本文介绍了JNI的概述、安装与配置以及使用方法,并提供了两个完整的示例。JNI是Java与其他语言进行交互的一种机制,对于进行Java与C/C++交互的开发者来说,在深入掌握JNI的同时,还需要掌握其他技术,比如JNA、SWIG等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA中JNI的简单使用分享 - Python技术站