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
相关推荐
利用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 来...
visual studio 2019下C++通过JNI调用JAVA代码
java调用c++ 动态库,踩过好多坑,终于调通了,和大家分享一下
JAVA通过JNI调用C++代码函数的示例DEMO
C++库封装JNI接口-实现java调用c++
通过jni完成java调用c/c++,包含c/c++生成Dll动态库
完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接。...
JNI调用C++代码和C++层回调java层 demo
Android-JNI完整工程,实现c调用java和java调用c
本文档在三个方面叙述了java使用JNI调用C++的实例,①java与c++间没有参数传值,②java传入整型,c++返回整型,③java传入两个整型参数,c++返回整型数组。 有需要做以上几方面处理的情下载本文档,简单、清晰、一看...
Java通过JNI调用C++接口,Demo文档描述(里面有代码),里面有Windows下调用版和linux下调用版,经本人亲自测试,可用。
完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...
android配置ndk,使用swig编译生成jni Java接口调用c++方法。这是成功的例子,前提是你要配置一下你的环境变量。如有疑问,可以去查看我的博客。有相关内容。
Android Studio3.0开发JNI流程,C++调用Java以及Java调用C++,C++/Java互相调用一个简单案例
Android JNI基础-利用JNI实现JAVA调用C++代码
在VS2013中使用JNI进行JAVA和C++之间的互调,这两个文件只是项目中的一部分,仅供参考
使用Jni实现对C++类库调用的实例,主要方法是利用了C++中的指针机制和jlong类型的对接,从而在java中能够调用c++。
利用JAVAH生成C++的JNI类,使用JAR打包生成可执行包