java 调用c++
java调用c++ 用的是java的JNI技术即java native interface,这个就是java调用c++底层接口, 通过用jni
可以实现java和jvm以外的c++通讯互相调用。
首先新建一个java项目,在此命名为HelloWorld,然后新建一个包为jni,在jni下新建一个类命名为HelloWorld
项目完整接口入下图:
其次编译HelloWorld.java ,并且生成为HelloWorld.class.
package test; public class HelloWorld { static{ System.loadLibrary("HelloWorld"); } private native String hello(String say); public static void main(String[] args) { HelloWorld hw = new HelloWorld(); System.out.println("return value is:"+hw.hello("hi")); } }
生成HelloWorld.class 的方法为 在此类的上层目录下运行命令行,然后输入javac HelloWorld.java
再次生成相应c++程序的头文件 test_HelloWorld.h
生成test_HelloWorld.h的方法为 在此类的上层目录下运行命令行,然后输入javah -classpath E:\workspace_jee\JNI\src test.HelloWorld, 回车就在HelloWorld.java所在的目录下面生成了jni_HelloWorld.h头文件
生成的test_HelloWorld.h内容请看一下代码:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class test_HelloWorld */ #ifndef _Included_test_HelloWorld #define _Included_test_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: test_HelloWorld * Method: hello * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_test_HelloWorld_hello (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif
以上代码的意思,这里不做解释
下面就是为jni_HelloWorld.h 编写相应的.cpp文件,然后编译生成相应的.dll文件
打开vs2013(或者其他版本),然后新建HelloWorld一个控制台项目,注意此项目的名称应该和加载的dll的名字一致。
例如如果是System.loadLibrary("HelloWorld")加载相应的dll文件,那么新建的项目名称就应该是HelloWorld. 新建项目之后把生成的test_HelloWorld.h头文件,复制到vs的HelloWorld项目下,然后在HelloWorld.cpp中实现test_HelloWorld.h相应的方法
vs下项目的结构如下图:
编译生成dll文件,在此要注意,如果你的电脑是64位的 ,则要生成的是64位的dll
设置生成64位dll的方法是,vs上点击 生成->配置管理器->(在相应的项目下的)平台中选择X64然后关闭.如下图所示:
生成解决方案,则就生成了HelloWorld.dll,因为我的电脑是64位的,则在vs项目目录下的x64文件夹下产生了HelloWorld.dll,如果没有设置是x64 ,则在debug文件下产生。
把HelloWorld.dll复制到java项目的根目录下,在这里就是我们第一步生成的java项目HelloWorld的目录下。
运行HelloWorld这个java类:
1> 命令行下 通过java HelloWorld
2> eclipse 下直接运行
在liunx平台下的话,如果用到win下的库文件,要预编译,否则编译不通过
把项目copy到linux下,然后在相应的HelloWorld.cpp下运行一下命令:
g++ -I /usr/java/jdk1.7.0_75/include/linux/ -I /usr/java/jdk1.7.0_75/include/ -fPIC -shared -o libHelloWorld.so HelloWorld.cpp . 生成了.so 文件之后。copy到相应的java项目XXX.jar文件下,在同一个目录下,结构图如下:
指定libHelloWorld.so动态库所在的路径
export LD_LIBRARY_PATH=/usr/games/server/HelloWorld
#LD_LIBRARY_PATH这个环境变量指示动态连接器可以装载动态库的路径。
此步是设置将库文件所在路径加入LD_LIBRARY_PATH中去,如果不执行此步,在运行中就会出现异常: java.lang.UnsatisfiedLinkError: no XXX in java.library.path
相关推荐
总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...
Java 通过使用 JNI(Java Native Interface)接口可以调用 C++ 动态库,该技术可以大大扩展 Java 的能力,让 Java 应用程序可以与其他语言编写的程序进行交互。下面是 Java 使用 JNI 接口调用 C++ 动态库的详细步骤...
利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。 详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)
JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助
java 控制台输入密码显示星号 通过JNI 来调用 c++中方法 java 控制台输入密码显示星号 通过JNI 来调用 c++中方法 java 控制台输入密码显示星号 通过JNI 来调用 c++中方法 java 控制台输入密码显示星号 通过JNI 来...
Java 通过 JNI 调用 C++ 的 DLL 文件 JNI(Java Native Interface)是一种允许 Java 代码和本地应用程序交互的技术。通过 JNI,Java 应用程序可以调用本地库,反之亦然。本文将详细介绍如何使用 JNI 将 Java 应用...
6. **Java调用C++**: - 通过调用之前声明的native方法,Java代码可以直接触发C++代码的执行。 7. **C++调用Java**: - 通过`JNIEnv`指针,C++可以查找并调用Java对象的方法,访问字段,甚至创建新的Java对象。 ...
在C#环境中,使用Visual Studio或其他开发工具创建一个新的类库项目,编写需要被Java调用的公共方法。编译完成后,生成的DLL文件将包含可供其他程序使用的函数。 3. **JNI头文件生成**: 使用Java的`javah`工具,...
本文旨在介绍 Java 和 C++ 之间的互相调用实例,通过 JNI(Java Native Interface)技术,实现 Java 调用 C++ 和 C++ 调用 Java 的操作。下面将对标题、描述、标签和部分内容进行详细说明。 标题:JNI 调用实例...
在Qt for Android中,我们可以通过JNI来调用C++编写的Qt函数,或者在C++代码中调用Android的API,实现对设备硬件和特定平台功能的访问。 在使用JNI的过程中,有以下几个关键步骤: 1. **创建JNI头文件**:使用...
本示例DEMO将详细介绍如何在Java程序中通过JNI调用C++代码函数。 首先,我们需要理解JNI的工作原理。JNI提供了一种方式,让Java虚拟机(JVM)能够调用本地方法,这些方法可以是C、C++或者其他本地语言编写的。JNI...
Java(JDK17)通过JNI实现调用C++动态链接库- CMake模块化项目管理
标题“java调用c++生成so库”指的是在Linux环境下,通过JNI技术,Java程序可以调用预先用C++编译生成的动态链接库(.so文件)。.so文件是Linux下的动态共享对象,相当于Windows下的.DLL文件,它包含了可由多个程序...
本教程将详细介绍如何在Android项目中使用JNI调用C++代码。 首先,你需要配置Android的NDK(Native Development Kit)。NDK是一组工具,开发者可以用它来编写用C和C++编写的应用程序模块,这些模块可以直接在...
Java 通过 JNI 调用 C/C++ 实现动态库加载 Java Native Interface (JNI) 是 Java虚拟机(JVM)提供的一种接口,允许 Java 代码和本地代码(如 C/C++)之间的交互。通过 JNI,Java 程序可以调用 C/C++ 代码,实现 ...
总结:使用JNI调用C++库的过程涉及Java和C++的协同工作,包括Java环境配置、JNI接口设计、头文件生成、C++源码编写、编译生成DLL以及在Java中加载和调用。整个过程需要对两种语言都有一定的了解,但通过这种方式,...
在本示例中,我们将探讨如何通过JNI在Java中调用C++代码,并最终打包成可执行的JAR包。 首先,让我们理解基本流程: 1. **创建Java类并声明native方法**: - `ChangeMethodFromJni.java` 和 `TestJNI.java` 文件...
1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一个桥梁,可以调用本地代码(如C++),反之亦然。这使得开发者可以在必要时利用C++的性能优势或者调用系统级API。 - Java程序通过`System.loadLibrary`或...
在Java编程环境中,有时我们需要利用C++编写的高性能或特定功能的库,这时可以借助Java的JNI(Java Native Interface)技术来调用C++编写的动态链接库(DLL)。本教程将详细介绍如何在Java中调用C++动态库,并通过...
总结来说,这个"JNI DEMO"是一个完整的示例,展示了如何使用Java的JNI技术来调用C/C++编写的DLL。它包括了Java代码、JNI接口的实现、DLL的编译以及Java应用的运行。对于初学者,这是一个很好的实践教程,即使没有...