商城网站支付系统怎么做,广州建站网络公司,旅行的意义 wordpress主题,自己买个服务器做代挂网站文章目录 1_JNI是什么#xff1f;2_使用3_扩展 1_JNI是什么#xff1f;
JNI 是Java Native Interface的缩写#xff0c;通过JNI#xff0c;允许Java代码与其他语言#xff08;通常是C或C#xff09;编写的本地应用程序或库进行交互。简而言之就是#xff0c;Java可以通… 文章目录 1_JNI是什么2_使用3_扩展 1_JNI是什么
JNI 是Java Native Interface的缩写通过JNI允许Java代码与其他语言通常是C或C编写的本地应用程序或库进行交互。简而言之就是Java可以通过JNI调用C 或 C 语言写的代码。
2_使用
1、首先准备一个demo让我们进行JNI的快速入门使用
/*** author shenyang* version 1.0* info JNI* since 2024/6/29 下午5:03*/
public class JNIDemo {public static void main(String[] args) {System.out.println(System.getProperty(java.library.path));System.out.println(add(1,2));}
}2、需要将C/C实现的方法用native关键字声明。
由native关键字声明的方法我们就不需要给出方法体了直接给出声明就好了。
public static native int add(int a, int b);//这个方法的作用是将两个整型相加3、加载动态链接库windows上.dll为后缀linux上.so为后缀名通常是使用静态代码块来进行导入。
使用 System对象的 public static void loadLibrary(String libname)方法不需要后缀只要库所在路径加上库名。
static {System.loadLibrary(jniDemo);
}4、使用 javac -h或 javah生成.h为后缀的头文件
注意jdk10之后将javah这一命令移除了JEP313: 移除JDK中附带的javah工具。注意下面第一个参数是存放到当前路径下./
javac -h ./ JNIDemo.java生成的头文件JNIDemo.h。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include jni.h //这个头文件在jdk/include/下
/* Header for class JNIDemo */#ifndef _Included_JNIDemo
#define _Included_JNIDemo
#ifdef __cplusplus
extern C {
#endif
/** Class: JNIDemo 说明这个方法是在哪个类里* Method: add 对应的是java中的add方法* Signature: (II)I 括号里两个II表示第一个参数和第二个参数都是int类型括号后面的I表示这个方法的返回值是int类型* 下面这部分是C需要实现的函数声明*/
JNIEXPORT jint JNICALL Java_JNIDemo_add(JNIEnv *, jclass, jint, jint);#ifdef __cplusplus
}
#endif
#endif下面这部分是C需要实现的函数声明
JNIEXPORT jint JNICALL Java_JNIDemo_add(JNIEnv *, jclass, jint, jint);5、根据生成的头文件里的函数声明实现对应的函数创建JNIDemo.cpp文件。
注意下面的代码包含了之前生成的头文件JNIDemo.h还需要其他头文件也可以一并包含进去比如iostream。下面四个参数JNIEnv *是一个指针封装了一些JNI的操作在里面jclass参数也用不到只放一个参数类型就行了后面两个参数因为用的到所以把参数名加上。函数的最终目的是返回ab再加上一些其他操作我们进行测试
#include JNIDemo.h
#include iostreamJNIEXPORT jint JNICALL Java_JNIDemo_add(JNIEnv *, jclass , jint a, jint b)
{std::cout a a b b std::endl;return ab;
}6、将上面的cpp文件编译成动态链接库。
给对C不太了解的同学解释下下面命令的意义 -o jniDemo.dll: 指定输出文件的名称为jniDemo.dll与System.loadLibrary(jniDemo)中保持统一。在Windows系统上动态链接库通常以.dll为扩展名。 -fPIC: 表示生成位置无关代码Position-Independent Code。这是生成共享库时常用的选项使得生成的代码在加载到内存中的任何位置时都可以正确运行。 -shared: 指定生成一个共享库动态链接库而不是可执行文件。 -I: 包含路径选项用于指定头文件所在目录。在这里包含了特定于Windows系统的Java头文件。 JNIDemo.cpp: 源文件名包含了具体的JNI方法实现。 如果windows电脑上使用不了g命令那么可以下载MinGWX64 - x86_64-win32-sjlj。
g -o jniDemo.dll -fPIC -shared -IE:\shenyang\.jdks\jdk-1.8\include\win32 -IE:\shenyang\.jdks\jdk-1.8\include JNIDemo.cpp执行完毕后发先目录下出现jniDemo.dll文件 最后运行 JNIDemo.java 查看运行结果 3_扩展
基础数据类型对应表
Java 类型JNI 类型C/C 类型描述booleanjbooleanunsigned char布尔类型值为true或false 使用0表示false非0表示true。bytejbytesigned char8位有符号整数charjcharunsigned short16位无符号Unicode字符shortjshortshort16位有符号整数intjintint32位有符号整数longjlonglong long64位有符号整数floatjfloatfloat32位单精度浮点数doublejdoubledouble64位双精度浮点数voidvoidvoid无类型
引用数据类型对应表
Java 类型JNI 类型描述StringjstringJava字符串Objectjobject任意Java对象ClassjclassJava类ThrowablejthrowableJava异常对象boolean[]jbooleanArray布尔型数组byte[]jbyteArray字节型数组char[]jcharArray字符型数组short[]jshortArray短整型数组int[]jintArray整型数组long[]jlongArray长整型数组float[]jfloatArray单精度浮点型数组double[]jdoubleArray双精度浮点型数组任意类型的对象数组jobjectArray对象数组Java数组中的任意类型jarray通用数组类型