Java调用C++
2015-09-07 18:55
501 查看
1.Myeclipse中新建一个Java工程。project name为JavaNativeInterface。
2.写一个本地方法声明,如下:
Java代码
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中的
C++代码
JNIEXPORT void JNICALL Java_com_czq_test_NativeTest_printInfo (JNIEnv *, jobject);
至VC项目中的主CPP文件中,并添加自己的c++代码,整个主CPP文件中的代码如下:
C++代码
// 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工程,新建一个测试类,代码如下:
Java代码
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代码
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变量,重启机器后生效。
2.写一个本地方法声明,如下:
Java代码
package com.czq.test; public class NativeTest { public native void printInfo(); }
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中的
C++代码
JNIEXPORT void JNICALL Java_com_czq_test_NativeTest_printInfo (JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_com_czq_test_NativeTest_printInfo (JNIEnv *, jobject);
至VC项目中的主CPP文件中,并添加自己的c++代码,整个主CPP文件中的代码如下:
C++代码
// 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;
};
// 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工程,新建一个测试类,代码如下:
Java代码
package com.czq.test;
public class MainTest {
public static void main(String[] args) {
System.loadLibrary("JavaNativeInterface");
//JavaNativeInterface为生成的dll的名字
NativeTest nativeTest=new NativeTest();
nativeTest.printInfo();
}
}
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代码
Java代码
package com.czq.test; public class EnvTest { public static void main(String[] args) { System.out.println(System.getProperties().getProperty("java.library.path")); } }
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++类库--JNI
- 对C++中字符串常量的理解
- c++题目——内存管理——待解决
- c语言实现希尔排序
- C C++ Intro - C语言中函数参数入栈的顺序
- 为多态基类声明一个虚析构函数(Effective C++_7)
- C语言基础测试题02
- 第二周项目:C/C++函数参数传递的三种方式
- 第二周项目:C/C++语言中函数参数传递的三种方式
- c++题目
- C++程序
- C语言基础测试题01
- C++类中初始化成员变量总结
- C语言指针强制类型转换
- C++——并发编程
- c/c++ 软件集成 安装和可卸载软件
- 第二周项目- C/C++语言中函数参数传递的三种方式
- 一个c++题目
- 第2周项目1C/C++语言中函数参数传递的三种方式
- 周一C/C++语音中函数参数传递的三种方式