![4791b202568691f855b877b900f29a1d.png](https://img-blog.csdnimg.cn/img_convert/4791b202568691f855b877b900f29a1d.png)
爪哇族(java)和赛佳部落(C++)是原始森林的两个部落,爪哇族的皇子爪子一直在世界游学。最近收到消息,父皇在御驾亲征赛佳人时,不幸被杀,命他速速回去,处理后事。
![8d7d6efcc2332bd707ace2c636f914c1.png](https://img-blog.csdnimg.cn/img_convert/8d7d6efcc2332bd707ace2c636f914c1.png)
怎奈何,刚回去,父王已经呜呼,爪子被推上皇位。内忧外患,新皇登基,爪子先要定人心,和赛佳族签订了停战协议。
正值漫漫寒冬,爪子微服私访,看到子民大多冻死,尸横遍野,寒冷问题是父王发起征战的主要原因,因为爪哇族的计算力太弱了,计算力是唯一的燃料可以用来取暖御寒。爪子决定要解决部落的梦寐落后局面就要发展区域经济,要合作,不要战争。
爪子第一个瞄准的和做对象就是旁边赛佳部落,赛佳部落虽然地盘小,但民众启蒙早,计算力特别强,但是赛佳人不事农桑,不屑于体力劳动,聪明且懒惰,常常青黄不接。而爪哇族的人辛勤朴实,开垦了大片良田,粮仓满满,却难捱满满寒冬。
一个青黄不接,一个严寒难捱。这导致两个部落世代征战不休,掠夺、奴役,部落之间积累了很深的仇怨隔阂,爪子的哥哥大爪子就是在一次部落守卫战争中牺牲的。
但在民族大义面前,个人的恩怨不值一提。爪子认为解决两个部落的问题,不能采用战争,而是合作。这种有违祖训的倡议,自然遭到部落长老的一致反对,都觉得他大逆不道,恩怨不分,杀父之仇,不共戴天,岂可草草。
![3bce6c12e0c45fff263d00a279cd96da.png](https://img-blog.csdnimg.cn/img_convert/3bce6c12e0c45fff263d00a279cd96da.png)
但爪子决心已定,
爪子王召集了部落内曾派出游学的青年才俊,秘密成立了一个部门叫做爪哇进出口贸易部门(简称JNI)。
爪子私会了一些赛佳族的开明人士,了解到,赛家族也有很强烈的合作意向,遂决定各自草拟一份合作草稿,定于十五日月圆夜,与交界处“欢喜山”共商国是。
遂召集进出口贸易部门,限时一周,连夜加班,草拟一份贸易接口协议。
是日也,爪子坐在帐内,与群妾诗词饮酒,门外眼子来报,是JNI的部长程旭远觐见。急忙命令左右舞姬随从退下,召见程旭远,
程旭远见礼后,二话不说,递上JNI协议草稿。
爪子展卷细读,蝇头小字仍有墨香,上书如下:
~~~~~~~~~~~~JNI协议笔记~~~~~~~~~~~~~
1 Java中声明
(1) native方法是被编译成一个共享库,需要先加载这个库告诉java编译器
static
(2) native 方法告诉java虚拟机该方法是用别的语言实现的
public
2 C++层实现
#include
注:参数解释 JNIEnv:是一系列JNI函数指针 jobject thiz:指向java中的实例,因为该native在java中非静态,绑定在实例上 jclass clazz: 指向java中的类,因 该native方法在java中是静态的,绑定在类上。
3 常见类型转换模板
(1)基本数据类型
java中的基本类型直接映射到C++中相应的基本类型
![470896185d3d1388be17709e6c2547f1.png](https://img-blog.csdnimg.cn/img_convert/470896185d3d1388be17709e6c2547f1.png)
(2)引用型
引用类型不能直接传递,而是作为一种不透明引用传递。它们需要用JNIEnv中提供的方法进行解析和封装.
![7827a4cd08d15e0f75bff08cd08c1de2.png](https://img-blog.csdnimg.cn/img_convert/7827a4cd08d15e0f75bff08cd08c1de2.png)
(3) C++中String类型
【读取】
const
如果iscopy是True,则str是java字符串的一个拷贝,否则就只是一个引用。
【释放】
(
【封装】
jstring
(4) C++中的复制Java数组
【读取】
Jint
【封装】
(
(5)C++中获得Java数组指针
【获取指针】
//通过Get<Type>ArrayElements方法获得调用,
这里的isCopy是表示你想获取的这个指针是一个拷贝的指针变量,还是直接堆中的变量
【释放资源】
(
![714d5bb9509aa7e261c5a80ce379d212.png](https://img-blog.csdnimg.cn/img_convert/714d5bb9509aa7e261c5a80ce379d212.png)
(6)JNI位缓存
【获取位缓存】
unsigned
【封装位缓存】
unsigned
(7)JNI操作Java成员变量
【静态和实例成员变量】(或者叫Field 域)
public
【获取域的ID】
这里的ID表示JNI中的一个索引。
对于成员变量:
// 1 通过实例获取类
对于静态成员变量
// 直接通过类获取静态的域ID
【通过ID获得域内容】
获取某种类型的域 GetStaticField 或者 GetField
jstring
(8)C++操作Java成员方法
在 native中调用Java方法非常耗费资源,所以做接口时要谨慎考虑。
【java中两种方法】
public
【获得方法ID】
// 对于成员方法
【调用所获得的方法】
// 通过Call<Type>Method调用实例成员方法
(9)异常捕获
【在java中定义异常函数】
public
【异常句柄】
jthrowable
【C++中抛出异常】
jclass
(10)局部引用与全局引用的转化
【获取局部引用】
jclass
【局部引用转成全局引用】
jclass
【删除全局引用】
(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
看完之后,爪子拍案叫绝,“甚合我意,甚合我意,命给程爱卿涨薪一千,鸡腿5只,上等鼠标键盘一套,珍藏版美女鼠标垫一个”。并决定中秋夜带着程旭远一起共赴和谈。
![f889ccffa63ddcfd23a44d52116f709a.png](https://img-blog.csdnimg.cn/img_convert/f889ccffa63ddcfd23a44d52116f709a.png)
命左右添酒回灯重开宴,歌舞升平,与爱卿共饮。
饮酒正欢,突然账外哨兵来人,仓皇跑进来跪地哭道:“我方边境防御塔被赛佳人摧毁,他们已经长驱直入,趁我们刚吃败仗,内部空虚,长驱直入,键盘侠将军急求大王增援前线”。
欲知后事如何,且看下回分解。