JNI查漏补缺

文章目录

目录

一、JNI是什么?

二、JNI使用步骤

1.创建java文件,添加要引用的jni java接口

2.编译java文件到class文件

3.生成jni头文件

4.根据头文件创建cpp文件,并实现jni接口

5.编译cpp到jni动态库

6.修改动态库查找路径

7.运行

总结



一、JNI是什么?

JNI是Java Native Interface,一种在java层调用c/c++层的技术,可以实现不同语言代码交互,实现底层硬件功能适配。

二、JNI使用步骤

1.创建java文件,添加要引用的jni java接口

创建文件

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");
	}
}

2.编译java文件到class文件

javac HelloWorld.java

3.生成jni头文件

javah -classpath . HelloWorld

4.根据头文件创建cpp文件,并实现jni接口

自动创建的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

5.编译cpp到jni动态库

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

6.修改动态库查找路径

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

7.运行

java HelloWorld
#cpp say hello world
#call jni sayhello

总结

JNI主要的步骤在JNI适配层的编写,适配层主要工作在于参数的处理。

你可能感兴趣的:(基础查漏补缺,java)