# jnitest **Repository Path**: MoqiLintong/jnitest ## Basic Information - **Project Name**: jnitest - **Description**: C 程序可以实现操作系统级别的事件处理,如编写一个浪费内存的 Demo。Java 由于 GC 机制,就实现不了这样的一个模拟程序,于是花了一些时间去了解 Java 提供的 JNI API,这里给出我的简单总结 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: primary - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2021-10-10 - **Last Updated**: 2024-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 编写 C/C++ 库并在 Java 中调用 > 参考文档: > > - [JNI 编程教程](https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html) > > - [Java如何调用C程序,JNI技术](https://blog.csdn.net/u011181989/article/details/92242435) > > - [Java语言与C语言混合编程(2)--在Java中调用C语言本地库](https://www.cnblogs.com/moon1992/p/5260226.html) > - [解决 java.lang.UnsatisfiedLinkError:no ** in java.library.path in java.library.path 的异常](https://www.cnblogs.com/geekHao/p/12820476.html) > - [GCC生成动态链接库(.so文件):-shared和-fPIC选项](http://c.biancheng.net/view/2385.html) > ```bash # 1. 编写一个含有 `native` 方法的 Java 类并编译 # public class HelloWorld { # public native String sayHelloWorld(); # } javac -d . HelloWorld.java # 2. 用 `javah` 命令生成 JNI 风格的头文件 # -jni 选项可省略 类名为全限定名 javah -jni HelloWorld # 3. 编写 C 文件,如 HelloWorld.c # 注意!!!方法定义时,参数名称不可忽略(C 语言的语法细节) # 一些 C 与 Java 变量类型之间的映射,请参考 https://www.cnblogs.com/moon1992/p/5260226.html # #include "HelloWorld.h" # # JNIEXPORT jstring JNICALL Java_HelloWorld_sayHelloWorld(JNIEnv *env, jobject obj) { # return (*env)->NewStringUTF(env, "Hello, World!"); # } # 4. 从3中编写的 C 文件创建动态链接库 # -I 指定 HelloWorld.c 依赖的头文件 jni.h 和 jni_md.h 的路径 gcc -fPIC -I ./ -I $JAVA_HOME/include/ -I $JAVA_HOME/include/linux/ -c HelloWorld.c gcc -shared HelloWorld.o -o hello.so # 上面的两行命令可合并为下面的一个 gcc -fPIC -shared -I ./ -I $JAVA_HOME/include/ -I $JAVA_HOME/include/linux/ HelloWorld.c -o libhello.so # 5. 编写测试类,如 JniTest.java, # 加载库文件 System.loadLibrary("hello"); # 注意,上面的库文件名有前缀 lib-, 这里的加载语句不含 lib- # 对于像 Windows 系统中的 .dll 或 Linux 系统的 .so 这样的文件扩展名,加载时也不含 # 6. 编译并运行测试类 javac -d . JniTest.java # 在运行时需要指定库文件的位置 java -Djava.library.path=$(pwd) JniTest # 或者设置环境变量 LD_LIBRARY_PATH 后运行 export LD_LIBRARY_PATH="$(pwd):$LD_LIBRARY_PATH" java JniTest # 7. 结果显示 # 测试类会每隔 10s 打印一行 Hello, World! ```