JNI使用

走远了吗. 提交于 2019-12-06 08:34:21

对于如何使用JNI的初衷是因为看jdk源码时看到有native关键字,由于对这个关键字很陌生,就查了下,原来是Java调用C/C++写的动态库文件时才使用到的,因此便学习了下,使用方法如下:



native用法:用native修饰的方法表示,该方法的实现不是在当前文件,而是用其它语言(如:C/C++)实现,java语言不能对操作系统底层进行操作和访问,因此需要使用JNI接口调用


实现示例:
package com.summary;


public class JNITest {

public native void hello();

static{
System.loadLibrary("JNITest");
}

public static void main(String[] args){
new JNITest().hello();
// System.out.println(System.getProperty("java.library.path"));
}
}


编译:
1、先建立编译后文件存放目录:out/com/summary/, out和src目录同级,如下:
--JNITest
--src
--com
--summary
JNITest.java

--out
--com
--summary
JNITest.class


2、cmd到JacobTest目录下,执行:
javac -d ../out com/summary/JNITest.java


3、cmd到out目录下,执行命令生成供C/C++调用.h文件:
javah -jni com.summary.JNITest


此时可以看到,out目录下生成了一个com_summary_JNITest.h的头文件,不要修改该文件,将此文件作为需要实现OCRSpecialFilm方法的C/C++ 工程使用;


4、用vs建立C++类型为class library的工程,将jdk安装目录下的include目录下的jni_md.h和jni.h以及生成的com_summary_JNITest.h头文件拷贝至C++工程下,
在C++文件中实现com_summary_JNITest.h中声明的方法,如下:
//JNITest.cpp中实现
// This is the main DLL file.

#include "stdafx.h"
#include "JNITest.h"

#include "com_summary_JNITest.h"
#include "jni.h"
#include "jni_md.h"
#include <iostream>


using namespace std;


JNIEXPORT void JNICALL Java_com_summary_JNITest_hello(JNIEnv *, jobject) {
cout<<"hello world jni test"<<endl;
}


5、编译工程,生成JNITest.dll文件,将该文件拷贝至java类加载目录(如不清楚,可以使用System.out.println(System.getProperty("java.library.path"));打印出相应目录),
再到java工程下运行程序,在控制台打印输出
hello world jni test

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!