# native-jni-benchmarks **Repository Path**: li-xingfu/native-jni-benchmarks ## Basic Information - **Project Name**: native-jni-benchmarks - **Description**: native与jni接口对比 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-09-08 - **Last Updated**: 2023-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 介绍 该仓是native与jni代码仓,用于native与jni接口的性能对比 ### Linux搭建jni环境步骤 ##### 下载并安装Java JDK ###### 1、创建jdk存放路径(根据自己路径来) ` mkdir -p ~/tools/java ` ###### 2、下载并解压OpenJDK(请根据需要选择版本) ` wget https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz -O ~/tools/java/openjdk.tar.gz ` 或者 ` wget https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz ` ` tar -xzvf openjdk.tar.gz -C ~/tools/java ` ###### 3、设置JAVA_HOME环境变量 ` echo 'export JAVA_HOME=~/tools/java/jdk-11.0.1' >> ~/.bashrc ` ` echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc ` ` source ~/.bashrc ` 或者手动编辑.bashrc将jdk添加进环境变量中 ###### 4、验证Java是否安装成功 ` java -version ` ![输入图片说明](img/image.png) ##### 编写一个简单的jni代码进行验证 ###### 1、创建一个包含JNI原生方法声明的Java类,例如: public class MyJNIDemo { public native void myNativeMethod(); static { System.loadLibrary("mylibrary"); // "mylibrary" 是后面将要编译的共享库的名称 } public static void main(String[] args) { MyJNIDemo demo = new MyJNIDemo(); demo.myNativeMethod(); System.out.println("I is jni java"); } } ###### 2、 编译Java代码 在包含Java代码的目录中,使用javac编译器编译Java代码: ` javac MyJNIDemo.java ` 编写C/C++代码来实现JNI原生方法。创建一个名为MyJNIDemo.cpp的文件: #include #include extern "C" JNIEXPORT void JNICALL Java_MyJNIDemo_myNativeMethod(JNIEnv *env, jobject obj) { // 实现JNI原生方法的代码 // 在这里可以调用C/C++函数 printf("I is jni cpp\n"); } 编译C/C++代码,使用C/C++编译器来编译C/C++代码,同时链接到JVM库,以便在运行时能够与Java代码进行交互。在此示例中,我们将使用g++: ` g++ -shared -o libmylibrary.so MyJNIDemo.cpp -I$JAVA_HOME/include -I$JAVA_HOME/include/linux ` 说明: -shared : 生成共享库 -o libmylibrary.so MyJNIDemo.cpp :输出的库文件,libmylibrary.so是你要生成的so文件名,前面必需用lib作为前缀,MyJNIDemo.cpp是需要编译的cpp文件 -I$JAVA_HOME/include -I$JAVA_HOME/include/linux : 生成库时需要链接内置的库文件 运行Java应用程序,在包含Java代码的目录中运行Java应用程序: ` java -Djava.library.path=./ MyJNIDemo ` 说明: -Djava.library.path=./ : 需要链接的so路径,运行jni时,Java不会自动链接so文件,需要手动链接 目录结构: ![输入图片说明](img/%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84.png) 运行结果: ![输入图片说明](img/jni%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C.png)