Java 程序可以“一次编写,到处运行”,原因是它运行在 Ja va 虚拟机上。
正是由于这个原因,它的执行效率也会相应打些折扣,特别是一些与操作系统连接比较紧密的操作。
所以 Java 也提供了本地接口,以便直接调用其它更高效的程序接口,例如 C 、C ++ 等等。
MinGW 是一个运行在 Windows 平台的 C 、C ++ 编译器,支持 Make 、Gdb 等类似 Linux 环境下 GCC 的功能。
下面演示一下用 MinGW 将 C 程序编译成动态链接库,再使用 Java 的本地方法调用 C 程序中的函数。
1、创建 Java 类文件并声明本地接口
package testnative; //未定义包名会调用时会出现 java.lang.UnsatisfiedLinkError
public class CheckFile {
static {// 动态库名称为 test.dll
System.loadLibrary("test");
}
// 本地方法名称
public native void printHello();
public static void main(String[] args) {
try {// 测试运行
new CheckFile().printHello();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、根据 CheckFile 自动生成 C ++ 头文件 testnative_CheckFile.h
> javah -classpath . -jni testnative.CheckFile
3、根据头文件 testnative_CheckFile.h 编写 C ++ 程序
#include "CheckFile.h"
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_testnative_CheckFile_printHello (JNIEnv *e, jobject o) {
cout << "hello" << endl;
}
4、编译 C ++ 程序为动态链接库 test.dll
注意 JDK 的路径
> g++ -ID:\tools\jdk1.6.0_16\include -ID:\tools\jdk1.6.0_16\include\win32 -fPIC -Wall -g -c CheckFile.cpp
生成 CheckFile.o 文件后,再生成动态链接库 test.dll
> g++ -shared -Wl,--kill-at -o test.dll CheckFile.o
5、测试执行
> java -Djava.library.path=. -cp . testnative.CheckFile
分享到:
相关推荐
OpenSSL,版本1.0.1e,使用MinGW编译,静态库
如何在mingw中调用MSVC环境下编译的dll。
内容概要: 1. python通过ctypes调用C DLL库,传递结构体,保存信息 2. 解析xls表格数据,调用C接口,将信息写入到文件 3. mingw编译C DLL库用例 适用人群:python+C程序员 使用场景及目标:开发 其它说明:无
计算代数库Pari,版本2.5.5,使用MinGW编译,包含动态库和静态库
Java通过JNI调用Eclipse、MinGW编译C++出来的dll,仅仅是一个简单的示例,关键是整个流程要走通,详细参见:http://blog.csdn.net/yanzi1225627/article/details/18891613
windows下基于MinGW编译ffmpeg之_初级篇_中级篇
libevent-2.0.22-stable在windows环境下使用mingw编译
QZxing动态库集合 编译环境Qt5.9.0 win10 分别以下编译器编译的 mingw32 msvc2015_32 msvc2015_64 下载后根据配置即可用
使用mingw4.9.2编译后的zlib-1.2.5,包含头文件和.a文件
说明:已经编译好的MySql驱动动态库,包含libqsqlmysql.a、libqsqlmysqld.a、qsqlmysql.dll、qsqlmysqld.dll四个文件; 使用方式:将这四个文件复制到D:\Qt\Qt5.12.12\5.12.12\mingw73_64\plugins\sqldrivers路径下...
使用 mingw 编译出 sqlite3.dll 和 sqlite3.exe 2. lsqlite3 (也是本压缩包的原型) http://lua.sqlite.org 从下面网址下载 Version 0.8 http://lua.sqlite.org/index.cgi/zip/lsqlite3_svn08.zip?uuid=svn_8 ...
Qt官方开发工具只提供了动态编译版本,生成的dll文件比较多,程序占用空间也比较大,而利用静态库进行编译就可以编译出体积小很多的单文件程序。 Qt5.6.3版本是一个有着特殊意义的版本,他是最后一版支持winxp的Qt...
基于Qt的MinGw编译PCL及其所有依赖库boost、eigen、flann、qhull、VTK的成果,可在Qt直接调用运行
用mingw编译好的qtwebkit组件
Mingw编译的OSG库,下载的OSG库版本为3.4,在QT上配置好环境,可以直接使用。
使用Qt5.6.0 MingW编译的Qt2.4.9库文件,解压可直接使用。
为了能在32位和64位windows平台VS或VC环境下的C/C++工程能够调用fortran语言编写的科学计算库函数或者自己编写的fortran函数,实现C/C++与fortran的混编,这里采用MinGW软件在windows平台下用unix/linux环境下的GNU ...
libevent-2.1.12-stable openssl1.1.1f 在windows环境下使用mingw编译 包含libevent 下的lib、include、bin和openssl的lib、include、bin 自己项目使用
用Qt5.9.2的minGw编译出来的OSG库文件,包含头文件和dll文件,lib文件。用于在Qt5中调用OSG的接口。
使用mingw4.9.2编译后的libxml2-2.7.7安装包,包括lib、bin、include等