独孤九剑-JNI
程序员文章站
2022-06-12 21:19:02
...
01. 创建工程
1.1. java native方法类定义
```java
package com.hotmail.jni;
public class JNIDemo {
// 定义动态链接库
public native String echo(String msg, boolean flag);
public native int sqrt(int x, int y);
public native float sum(float a, float b);
public native double sum(double a, double b);
public static void main(String[] args) {
// 加载动态库
System.loadLibrary("JNIDemo");
JNIDemo jniDemo = new JNIDemo();
String echo = jniDemo.echo("i'm jni demo", true);
int sqrt = jniDemo.sqrt(3, 4);
float sumFloat = jniDemo.sum(3.2f, 4.5f);
double sumDouble = jniDemo.sum(20.5, 10.0);
System.out.println("echo = " + echo);
System.out.println("sqrt = " + sqrt);
System.out.println("sum float = " + sumFloat);
System.out.println("sum double = " + sumDouble);
}
}
```
1.2. 编译JNI类的.h文件
-
javah命令
用法:javah [选项] <类>, [选项] 包括:-help
输出此帮助消息并退出-classpath <path>
用于装入类的路径-bootclasspath <path>
用于装入引导类的路径-d <dir>
输出目录-o <file>
输出文件(只能使用 -d 或 -o 中的一个)-jni
生成JNI样式的头文件(默认)-version
输出版本信息-verbose
启用详细输出-force
始终写入输出文件使用全限定名称指定 <类>(例如,java.lang.Object)。 -
编译为.h文件
cd …/src
javah com.hotmail.jni.JNIDemo// com_hotmail_jni_JNIDemo.h #include <jni.h> #ifndef _Included_com_hotmail_jni_JNIDemo #define _Included_com_hotmail_jni_JNIDemo #ifdef __cplusplus extern "C" { #endif JNIEXPORT jstring JNICALL Java_com_hotmail_jni_JNIDemo_echo (JNIEnv *, jobject, jstring, jboolean); JNIEXPORT jint JNICALL Java_com_hotmail_jni_JNIDemo_sqrt (JNIEnv *, jobject, jint, jint); JNIEXPORT jfloat JNICALL Java_com_hotmail_jni_JNIDemo_sum__FF (JNIEnv *, jobject, jfloat, jfloat); JNIEXPORT jdouble JNICALL Java_com_hotmail_jni_JNIDemo_sum__DD (JNIEnv *, jobject, jdouble, jdouble); #ifdef __cplusplus } #endif #endif
02. C++工程
新建 > 项目 > 模板 -> Visual C++ > DDL
-
引入头文件
调试(选择X64或X86) > JNI属性 > VC++目录
包含文件:加入jdk > include & include/win32 -
编译
生成 > 生成解决方案
上一篇: 牛肉和什么相克
下一篇: nginx的日志问题