Jimmy Chen

A Programmer

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

第三章之刻意练习

Practice 1

  在Java侧初始化两条提示语句,一个提示输入姓名,另一个提示输入住址,然后编写一个native方法,将其中的提示语句传给native方法,然后再native方法中获取输入,将输入的内容返回给Java侧,在Java侧打印native方法中输入的内容。(当然有时间的朋友可以尝试使用静态注册JNI方法和动态注册JNI方法这两种方式)

静态注册方式

** 1.1 Java侧代码: **

** 1.2 javah -jni产生的头文件 **

** 1.3 静态注册方法编写 **

动态注册方式

  动态注册JNI方法,签名的Java文件不用改,需要改的是Native侧的实现部分,下面是修改后的c文件

Practice 2

现在玩点特别的,现在我们设计一种简单的字符串加密算法,实际的算法部分我们都在native层实现,这样就可以通过编译成动态库(应该不会那么容易被破解查看里面的代码吧?),将算法部分保存起来,达到保护的作用。具体的设置想法如下:在Java侧处理字符串的输入,然后我们将字符串传给native层处理,native层的算法我们设计得简单点咯,第一个字符加1,、第二个字符加2、第三个字符加3、依次类推。字符串解密算法就是加密算法的逆过程,肯定有很多不严谨的地方,所以仅供娱乐练习JNI

** 2.1 Java侧代码 **

** 2.2 Native侧代码 **

  最后编译运行就可以了。

Practice 3

下面测试下时间性能,在Java侧编写一个冒泡排序算法,在native也编写一个冒泡排序算法,比较这两个时间性能,这里不能仅仅侧native的时间性能,还应该包括调用JNI的时间。一样仅供JNI编程练习,别太较真。

** 3.1 Java侧代码 **

** 3.2 Native侧代码 **

  最后发现,上面的代码,在Java侧做冒泡排序,I5-3320M的CPU,需要15.几秒,而native侧就要18.几秒,一方面Java调用native方法比Java调用Java方法要耗时,其次从虚拟机中复制数组数据到C缓冲区中也要时间。所以怎么看好像在native侧做排序都没有占到好处,不过也可能是native方法编写得不够有效率,不过目前就先这样了,毕竟才重新开始学JNI,有很多地方还不够熟悉的,后续有机会找到好方法再改进。

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

发表回复

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