Jimmy Chen

A Programmer

(原创) JNI编程指南与规范 第七章 刻意练习

第七章之刻意练习

练习1: 学会在C代码中创建虚拟机,复习类、方法ID的查找

在native侧,使用random函数生成一个包含1000个整型的数组,然后在native侧调用Java编程语言中的Arrays.sort(int [])方法对数组进行排序,然后打印数组的前100个数。

** 下面是博主自己写的答案 **

首先直接给上代码

上面的代码主要是学会在C程序中创建JavaVM以及调用Java编程语言中的方法。自己写过一两次应该也就会了。然后就是编译了,下面是博主的编译指令,博主使用的是Ubuntu 16.04 LTS版本。首先将编译指令:

其中-I$JAVA_HOME/include -I$JAVA_HOME/include/linux主要是为了提供头文件的包含目录,而-L$JAVA_HOME/jre/lib/amd64/server提供Java虚拟机动态库的链接目录,最后-ljmv表示链接到libjvm.so库。奇怪的是,-ljvm必须放到最后,编译才能成功,而放到其他位置的话都会报错:Parctice1.c:26: undefined reference to 'JNI_CreateJavaVM'。大家要想编译通过记得将-ljvm放最后就好了。

同样的JAVA_HOME需要改成自己的环境变量,博主已经在.bashrc中添加了自己的JAVA_HOME环境:

编译通过后,直接通过./Practice1运行就好了,不需要做特殊的设置,C程序就自动会根据代码中设置JavaVMOption路径查找到需要的库的了。

练习2: 学会多线程中使用JavaVM

编写一个线程函数,在函数内打印被调用的次数并且调用Java的java.util.Date类的方法,打印调用的时间按照hh:mm:ss方式打印,main函数就创建Java虚拟机环境,循环调用前面设计的打印时间线程函数,每次循环都使用random来产生1-5秒之间的数来决定休眠时间。

下面是我写的代码:

最后再按照Practice 1中的编译方法编译就好了。其实这个还可以改进下,提高执行的性能,大家发现没上面的每次创建线程并执行的时候都要再次查找工作,我们完全可以建立缓存,将方法ID保存起来提高性能的。这个就让大家自己试一试了。

** 此文为博主原创文章,转载请注明出处 **

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注