通过JNI java 调用c++_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 通过JNI java 调用c++

通过JNI java 调用c++

 2015/3/11 21:16:30  墙头上一根草  程序员俱乐部  我要评论(0)
  • 摘要:java调用c++java调用c++用的是java的JNI技术即javanativeinterface,这个就是java调用c++底层接口,通过用jni可以实现java和jvm以外的c++通讯互相调用。首先新建一个java项目,在此命名为HelloWorld,然后新建一个包为jni,在jni下新建一个类命名为HelloWorld项目完整接口入下图:其次编译HelloWorld.java,并且生成为HelloWorld.class.packagetest
  • 标签:c++ Java

? 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??

  • 大小: 9.1 KB
  • 大小: 79.4 KB
  • 大小: 117.6 KB
  • 大小: 2.5 KB
  • 查看图片附件
发表评论
用户名: 匿名