目录
JNI是Java Native Interface,一种在java层调用c/c++层的技术,可以实现不同语言代码交互,实现底层硬件功能适配。
创建文件
vim HelloWorld.java
添加代码
- public class HelloWorld
- {
- static
- {
- //载入的动态库系统库中查找,如果需要自定义路径需要配置LD_LIBRARY_PATH
- System.loadLibrary("HelloWorld");
- }
-
- //jni接口需要添加native标识
- public native void sayhello();
-
- public static void main(String[] args)
- {
- HelloWorld hw = new HelloWorld();
- hw.sayhello();
- System.out.println("call jni sayhello");
- }
- }
javac HelloWorld.java
javah -classpath . HelloWorld
自动创建的jni头文件:
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include
- /* Header for class HelloWorld */
-
- #ifndef _Included_HelloWorld
- #define _Included_HelloWorld
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: HelloWorld
- * Method: sayhello
- * Signature: ()V
- */
- JNIEXPORT void JNICALL Java_HelloWorld_sayhello
- (JNIEnv *, jobject);
-
- #ifdef __cplusplus
- }
- #endif
- #endif
由头文件复制为cpp文件并修改
- cp HelloWorld.h HelloWorld.cpp
- vim HelloWorld.cpp
- #include
- #include
- #include "HelloWorld.h"
-
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: HelloWorld
- * Method: sayhello
- * Signature: ()V
- */
- JNIEXPORT void JNICALL Java_HelloWorld_sayhello
- (JNIEnv *, jobject)
- {
- printf("cpp say hello world\n");
- }
-
-
-
- #ifdef __cplusplus
- }
- #endif
- gcc HelloWorld.cpp --shared -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -fPIC
- #$JAVA_HOME标识java安装路径
- #$JAVA_HOME/include引入jni.h
- #$JAVA_HOME/include/linux引入jni_md.h
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
- java HelloWorld
- #cpp say hello world
- #call jni sayhello
JNI主要的步骤在JNI适配层的编写,适配层主要工作在于参数的处理。