欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

独孤九剑-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
  • 编译
    生成 > 生成解决方案
相关标签: JNI