很早就想尝试下用java的native接口调用其他编程语言了,知道今天才Test了一把,毕竟java对于底层的调用限制太多。
废话不多说了,直接上实现步骤和代码吧。
1.Myeclipse中新建一个Java工程。project name为JavaNativeInterface。
2.写一个本地方法声明,如下:
package com.czq.test;
public class NativeTest {
public native void printInfo();
}
3.cmd下进入工程的bin目录
(我的路径为:E:\MyEclipse\MyWorkSpace\JavaNativeInterface\bin)
执行命令javah -classpath . -jni com.czq.test.NativeTest
执行此命令后,会在当前目录下产生一个.h文件(c/c++的头文件)
这一步非常重要。
4.打开VC(我的是microsoft visual studio 2010)。
新建->项目->Win32项目->完成。
新导航界面选择dll->完成。
项目的名字也是JavaNativeInterface
5.将com_czq_test_NativeTest.h(执行第三步javah命令得到的.h文件)、jni.h、jni_md.h引入头文件夹中。
com_czq_test_NativeTest.h由执行第三步javah命令得到;
jni.h位于%JAVA_HOME%/include下;
jni_md.h位于%JAVA_HOME%/include/win32下。
如果IDE提示头文件引入有问题,将com_czq_test_NativeTest.h中第二行的
#include <jni.h>改为#include "jni.h"
tip:这3个头文件缺一不可!
6.拷贝com_czq_test_NativeTest.h中的
JNIEXPORT void JNICALL Java_com_czq_test_NativeTest_printInfo
(JNIEnv *, jobject);
至VC项目中的主CPP文件中,并添加自己的c++代码,整个主CPP文件中的代码如下:
// JavaNativeInterface.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "com_czq_test_NativeTest.h"
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_com_czq_test_NativeTest_printInfo(JNIEnv *, jobject){
int sum=0;
for(int i=1;i<=100;i++){
sum+=i;
}
cout<<"1加到100的值是:"<<sum<<endl;
};
逻辑部分的代码可自行修改。
7.生成此VC项目的dll文件,并拷贝至%JAVA_HOME%/bin目录下(此目录可更改,后面会提到)。
8.返回Myeclipse中的JavaNativeInterface工程,新建一个测试类,代码如下:
package com.czq.test;
public class MainTest {
public static void main(String[] args) {
System.loadLibrary("JavaNativeInterface");
//JavaNativeInterface为生成的dll的名字
NativeTest nativeTest=new NativeTest();
nativeTest.printInfo();
}
}
运行main方法,控制台即会打印出"1加到100的值是:5050"。
===================到此java调用c++就结束了。======================
关于第七点dll文件的存放目录,做以下说明:
大家先运行一下此java代码
package com.czq.test;
public class EnvTest {
public static void main(String[] args) {
System.out.println(System.getProperties().getProperty("java.library.path"));
}
}
打印的结果实际上就是环境变量。
java要调用的dll文件只有在这些目录下才有效,否则会抛出异常。
所以,可以自定义一个目录来存放这些dll。当然,自定义的目录需要在环境变量中配置路径。我更改的系统的path变量,重启机器后生效。
这个列子,java和c++之间没有交互,只是单纯的java call c++而已。有兴趣深入研究的,可以继续研究下。
好了,就写到这里吧,欢迎大家一起交流。
最后附上java端和c++端的源代码。
分享到:
相关推荐
完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接
C++库封装JNI接口-实现java调用c++
使用java调用C++的dll文件
使用Java调用C++的动态库,注释全,一看就会,代码全给,需要使用Java调用第三方的动态库可参考我的博客结合代码快速实现。
JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助
海康威视 综合安防管理平台8700 java调用C++接口,提供录像下载相关功能! maven项目,Eclipse导入注意!
myEclipse java调用c++动态链接库实现人脸识别工程
使用Jni实现对C++类库调用的实例,主要方法是利用了C++中的指针机制和jlong类型的对接,从而在java中能够调用c++。
java调用C++写的dll的实例,希望对大家有帮助!
java 调用c++的示例,详见http://blog.csdn.net/u012587637/article/details/40348625
根据C++开发的webservice接口提供的WSDL文件,调用接口
java 调用DLL的方法,使用教程http://blog.csdn.net/pplcheer/article/details/52234697
Android Studio3.0开发JNI流程,C++调用Java以及Java调用C++,C++/Java互相调用一个简单案例
非常好用java调用c++ dll文件demo 直接可以用
java调用c++demo(避免不必要的通信调用) java调用c++demo(避免不必要的通信调用) java调用c++demo(避免不必要的通信调用)
公司的大神不知道从哪旮旯里找到了非通用的算法(C语言),常规算法都对不上,但数据要通讯,项目要做呀,我有点qt...他的算法是C写的,将他的算法改写成java,我有困难,就将他的代码打成dll,放到java中调用好了。
利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。 详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)
java调用C++动态库
Java调用C++的dll生成的VS2015项目
比较简单的java调用C代码的示例,可以为初学者提供借鉴。