欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数),jniarraylist

来源: javaer 分享于  点击 220 次 点评:132

Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数),jniarraylist


 

         我们知道Java是一个运行在虚拟机里面的高级的编程语言,如果要调用系统的动态链接库的话,就要先声明native修饰的方法(类似接口里面的方法),再由C/C++程序来实现(类似实现接口里的方法)。这样Java调用这些native方法就相当于调用了C/C++里面实现了的方法。通常我们把这种机制叫做JNI(Java NativeInterfac),即Java 本地编程接口


          Android也同理,要学会在Android上进行NDK开发,首先我们到打好java JNI的基础。现在我们暂时把Android开发丢到一边先,试试在Java之下编译一个C动态链接库,再用Java程序调用。

 

1)先来个最简单的打印HelloWorld例子:

Java代码(HelloJni.java)

 

生成头文件(HelloJni.h)

javac HelloJni.java编译你的Java源码,再javah–jni HelloJni生成所需的头文件

头文件内容是这样的:

 


实现头文件声明的方法(HelloJni.cpp)


 

 

编译命令g++ -I$JAVA_HOME/include-I$JAVA_HOME/include/linux HelloJni.cpp -shared -o libhello.so

命令参数解析:-I 是指引入java虚拟机的库的路径,-shared 是指编译成动态链接库(共享库) –o 输出文件名(注意,在Linux平台下的动态链接库有一个命名格式:“lib+库名+.so”在java代码里面loadLibrary的时候不要加lib前缀和.so后缀)

由于我这里把这个动态链接库编译放在当前目录下,所以还要设置环境变量LD_LIBRARY_PATH=so动态链接库所在的目录,才能正常运行

 

#############################+++华丽的分割线+++###########################


2)好了,可以打印HelloWorld出来后,我们再深入一点点,传入一个int的数,在C/C++代码里面加1后返回。

 

Java代码(HelloJni.java)

 

生成头文件(HelloJni.h)

 

实现头文件声明的方法(HelloJni.cpp)

 

运行结果:打印2


3)只是传入简单的数据类型不爽,这次让C/C++生成个Java对象返回

 

Java代码:pojo实体类(User.java)

 

Java代码(HelloJni.java)

 

生成头文件(HelloJni.h)

 

实现头文件声明的方法(HelloJni.cpp)

 

 

 

4)有些同学可能会说:“返回个Java对象算什么啊,C/C++和Java之间互传复杂对象才好玩呢!”正所谓“不怕做不到,就怕想不到”,我们接着重构一下上面那个例子!


这次我们传包含有User对象的List到C/C++程序里面


Java代码(User.java)

同上。

Java代码(HelloJni.java)

 

C头文件(HelloJni.h)

 

头文件的实现(HelloJni.cpp)

 

运行结果:

 

 

源码:E-Mail我:u_xtian@qq.com

原创作品,转载需注明出处...http://blog.csdn.net/u_xtian/archive/2010/11/25/6033963.aspx

相关文章

    暂无相关文章

用户点评