java native方法_java与c++停战:JNI合约

4791b202568691f855b877b900f29a1d.png

爪哇族(java)和赛佳部落(C++)是原始森林的两个部落,爪哇族的皇子爪子一直在世界游学。最近收到消息,父皇在御驾亲征赛佳人时,不幸被杀,命他速速回去,处理后事。

8d7d6efcc2332bd707ace2c636f914c1.png

怎奈何,刚回去,父王已经呜呼,爪子被推上皇位。内忧外患,新皇登基,爪子先要定人心,和赛佳族签订了停战协议。

正值漫漫寒冬,爪子微服私访,看到子民大多冻死,尸横遍野,寒冷问题是父王发起征战的主要原因,因为爪哇族的计算力太弱了,计算力是唯一的燃料可以用来取暖御寒。爪子决定要解决部落的梦寐落后局面就要发展区域经济,要合作,不要战争。

爪子第一个瞄准的和做对象就是旁边赛佳部落,赛佳部落虽然地盘小,但民众启蒙早,计算力特别强,但是赛佳人不事农桑,不屑于体力劳动,聪明且懒惰,常常青黄不接。而爪哇族的人辛勤朴实,开垦了大片良田,粮仓满满,却难捱满满寒冬。

一个青黄不接,一个严寒难捱。这导致两个部落世代征战不休,掠夺、奴役,部落之间积累了很深的仇怨隔阂,爪子的哥哥大爪子就是在一次部落守卫战争中牺牲的。

但在民族大义面前,个人的恩怨不值一提。爪子认为解决两个部落的问题,不能采用战争,而是合作。这种有违祖训的倡议,自然遭到部落长老的一致反对,都觉得他大逆不道,恩怨不分,杀父之仇,不共戴天,岂可草草。

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

(2)引用型

引用类型不能直接传递,而是作为一种不透明引用传递。它们需要用JNIEnv中提供的方法进行解析和封装.

7827a4cd08d15e0f75bff08cd08c1de2.png

(3) C++中String类型

【读取】

const 

如果iscopy是True,则str是java字符串的一个拷贝,否则就只是一个引用。

【释放】

(

【封装】

jstring 

(4) C++中的复制Java数组

【读取】

Jint 

【封装】

(

(5)C++中获得Java数组指针

【获取指针】

//通过Get<Type>ArrayElements方法获得调用,

这里的isCopy是表示你想获取的这个指针是一个拷贝的指针变量,还是直接堆中的变量

【释放资源】

(

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

命左右添酒回灯重开宴,歌舞升平,与爱卿共饮。

饮酒正欢,突然账外哨兵来人,仓皇跑进来跪地哭道:“我方边境防御塔被赛佳人摧毁,他们已经长驱直入,趁我们刚吃败仗,内部空虚,长驱直入,键盘侠将军急求大王增援前线”。

欲知后事如何,且看下回分解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值