`
czq5783095
  • 浏览: 48731 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java调用C++

阅读更多
很早就想尝试下用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++端的源代码。
分享到:
评论
1 楼 Heathersheng 2015-04-10  
我运行了java代码,可是报,这样的错,
Exception in thread "main" java.lang.UnsatisfiedLinkError: F:\myeclispe8.5-workspace\JavaNativeInterface\JavaNativeInterface.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
请教下是什么问题呀?

相关推荐

    java调用C++ webservice

    在IT行业中,跨语言通信是常见的需求,尤其是在Java和C++这样...总之,Java调用C++ Web服务是一个涉及到多种技术栈的过程,包括WSDL解析、SOAP通信、跨语言数据映射等。理解这些概念并熟练应用是实现跨语言通信的关键。

    C++库封装JNI接口-实现java调用c++

    总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...

    Java调用c++类对象

    Java调用C++类对象是一种跨语言交互技术,主要用于利用Java的平台独立性和C++的高性能。这种技术通常依赖于Java Native Interface (JNI),它允许Java代码直接调用本地(如C++)代码,反之亦然。下面我们将深入探讨...

    Java调用C++动态库

    本主题聚焦于“Java调用C++动态库”,这是一个关键的技术,它允许Java应用程序利用C++编写的高效库,比如图形处理、硬件驱动或者算法实现等。这种技术主要依赖于Java Native Interface (JNI),它是Java平台标准的一...

    JAVA调用C++demo

    首先,我们需要了解Java调用C++的基本步骤: 1. **创建Java类和 native 方法**:在Java类中声明一个native方法,这个方法对应于C++中的函数。例如: ```java public class NativeDemo { static { System....

    java调用C++动态链接库dll接口

    本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...

    JAVA调用C++/C#的DLL

    标题"JAVA调用C++/C#的DLL"涉及到的技术点主要集中在Java Native Interface(JNI)上,这是一种允许Java代码与其他编程语言(如C++或C#)进行交互的标准机制。下面我们将深入探讨这一主题。 首先,JNI是Java平台的...

    Java调用C++ API/dll示例程序

    完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接

    java调用C++编写的动态库dll

    在Java编程环境中,有时我们需要利用C++编写的高性能或特定功能的库,这时可以借助Java的JNI(Java Native Interface)技术来调用C++编写的动态链接库(DLL)。本教程将详细介绍如何在Java中调用C++动态库,并通过...

    myEclipse java调用c++动态链接库实现人脸识别所有工程

    这个项目"myEclipse java调用c++动态链接库实现人脸识别所有工程"正是这种需求的一个实例,它利用了Java的JNI(Java Native Interface)技术来调用C++编译的动态链接库(DLL),从而实现人脸识别功能。以下将详细...

    java调用C++

    总结起来,Java调用C++主要依赖于JNI,通过定义Java接口、生成头文件、编写C++实现、编译为动态库,最后在Java中加载库来实现。这是一项需要细心和技巧的任务,但对于需要高性能计算或者与底层系统紧密交互的项目来...

    java调用C++写的dll的实例

    Java调用C++编写的DLL动态链接库是跨语言交互的一种常见方式,主要利用了Java的JNI(Java Native Interface)技术。JNI允许Java代码与其他编程语言进行原生代码交互,包括C、C++等。本实例将详细讲解如何在Java项目...

    java调用c++生成so库

    标题“java调用c++生成so库”指的是在Linux环境下,通过JNI技术,Java程序可以调用预先用C++编译生成的动态链接库(.so文件)。.so文件是Linux下的动态共享对象,相当于Windows下的.DLL文件,它包含了可由多个程序...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    在Java中,调用C++函数并处理返回的二维数组: ```java int[][] input = ...; // 初始化输入数组 int[][] output = new int[height][width]; // 预分配输出数组 int result = myDll.processArray(input, output); `...

    java调用c++ dll的示例

    Java调用C++ DLL的步骤可以分为以下几个关键部分: 1. **编写C++ DLL**: 首先,你需要在C++环境中编写函数并将其打包到一个DLL中。DLL是一个可被多个程序共享的库,包含可执行代码和数据。在C++代码中,定义那些你...

    JNI快速实现入门(java调用C++程序的方法)

    JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助

    非常好用java调用c++ dll文件demo

    Java调用C++ DLL文件是跨语言编程中的一个重要应用场景,特别是在既有Java代码库又有C++动态链接库的情况下。本文将详细讲解如何在Java程序中调用C++编写的DLL文件,以及一个可用的示例。 首先,理解Java与C++交互...

    JAVA调用C++编写的DLL(C++和JAVA源码)

    本篇将详细讲解如何通过Java调用C++编写的DLL(动态链接库)。 标题中的"JAVA调用C++编写的DLL"涉及到的主要技术点是JNI(Java Native Interface),这是Java平台提供的一种机制,允许Java代码和其他语言写的代码...

    Java调用C++类库--JNI

    Java调用C++类库是跨语言编程中的一个重要应用场景,主要通过Java Native Interface(JNI)来实现。JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。这在需要利用C++的高性能计算、系统级...

    java 调用C++ 动态库

    总结来说,Java调用C++动态库是一个涉及多步骤的过程,包括生成JNI头文件、编写C++代码、编译动态库、加载库并在Java中调用本地方法。这个过程中需要考虑线程安全、数据类型转换以及异常处理等问题,以确保程序的...

Global site tag (gtag.js) - Google Analytics