整体流程:
初始.java文件 —— 生成.class文件 —— 生成.h头文件 —— 完善成.cpp文件 —— 生成JNI的dll文件 —— 完善初始java文件
目的:
现有C++版本的dll,需要转化成JNI的dll。此文中C++的dll:“Cpplus.dll”,目标JNI的dll:“JNI.dll”
首先准备的有:
1. 安装windows下的jdk,并配置;
2. 安装mingw_64。mingw_64位最新版下载地址 , mingw_32位最新版下载地址 .(该软件的作用是在windows系统使用gcc和g++命令,对c文件和c++文件进行编译,生成.o文件, 进而生成.dll文件。64位的只能生成64位的dll文件。若要生成32位的dll文件,请下载32位的mingw.)
2. 第二步或者利用VS编译器也可以。
步骤:
1.我电脑上没有eclipse,所以手动新建一个文件夹Proj,里面新建com\video\ocr三级文件夹,在ocr文件夹下新建一个java文件JavaSDK_Video.java,如图:
1.编写带有native声明方法的java类 (JavaSDK_Video.java)
public class JavaSDK_Video{ // 声明本地方法 public native short StartEx(String CorePath); public native short LoadImage(String szImagePath); static { // 加载DLL文件,先随便写 System.loadLibrary("aaa"); } public static void main(String[] args) { } }
2.使用javac命令编译java文件(JavaSDK_Video.class),要注意javac命令与com文件夹同级javac com\video\ocr\JavaSDK_Video.java3.使用javah生成c/c++原生函数的头文件 (JavaSDK_Video.h),javah与com包同级
javah com.video.ocr.JavaSDK_Video// JavaSDK_Video.h原文如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_video_ocr_JavaSDK_Video */ #ifndef _Included_com_video_ocr_JavaSDK_Video #define _Included_com_video_ocr_JavaSDK_Video #ifdef __cplusplus extern "C" { #endif /* * Class: com_video_ocr_JavaSDK_Video * Method: StartEx * Signature: (Ljava/lang/String;)S */ JNIEXPORT jshort JNICALL Java_com_video_ocr_JavaSDK_1Video_StartEx (JNIEnv *, jobject, jstring); /* * Class: com_video_ocr_JavaSDK_Video * Method: LoadImage * Signature: (Ljava/lang/String;)S */ JNIEXPORT jshort JNICALL Java_com_video_ocr_JavaSDK_1Video_LoadImage (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif注:本文的Java类用Notepad++编写。
4.复制刚才生成的.h文件,使用C/C++实现头文件中声明的函数(JavaSDK_Video.cpp)
// JavaSDK_Video.cpp原文如下:
#include "jni_md.h" #include "jni.h" #include <stdio.h> #include "stdlib.h" //··· 记得包含C++版dll所需的头文件 #include "com_video_ocr_JavaSDK_Video.h" JNIEXPORT jshort JNICALL Java_com_video_ocr_JavaSDK_1Video_XTH_1Start (JNIEnv *env, jobject obj) { return X_Start(); } JNIEXPORT jshort JNICALL Java_com_video_ocr_JavaSDK_1Video_XTH_1LoadImage (JNIEnv *env, jobject obj, jstring lpszImageFile) { ··· //jstringTostring的转换 return X_LoadImage(pImgPath); }
5.使用vs2015配置Jni工程,主要步骤在于依赖库的地址要输入正确,如图
6.编译此工程,生成Jni版dll(JNI.dll)
![]()
7.最后就可以完善刚才的初始java文件,修改添加正确的JNI版dll,完善main函数等。
其中上述是在VS编译器生成的dll,如果不想装VS,可以安装Mingw后通过命令行g++等命令生成dll,如下:
下载安装mingw_64位, 并将其安装目录配置到系统环境变量
安装完后将{minw安装目录}\mingw64\bin放到环境变量的path即可。生成.o文件
执行命令:
g++ -c -I"%JAVA_HOME%\include" - I"%JAVA_HOME%\include\win32" JavaSDK_Video.cpp执行完上述命令会生成JavaSDK_Video.o文件。
生成dll文件
执行命令:
g++ -Wl,--add-stdcall-alias -shared -o JNI.dll JavaSDK_Video.o

本文详述了如何将C++的dll文件转换为Java Native Interface (JNI)的dll文件,包括搭建开发环境、创建Java类、生成并实现C/C++头文件、配置及编译工程等步骤。


2064

被折叠的 条评论
为什么被折叠?



