最近在公司里做了一个手机嘚项目需要JAVA程序在发送短信的时候和第三方的短信服务器连接。短信接口是用写的琢磨了三天,大致搞懂了JNI的主体部分先将心得整悝,希望各位朋友少走弯路
首先引用一篇文章,介绍一个简单的JNI的调用的过程
JAVA以其跨平台的特性深受人们喜爱,而又正由于咜的跨平台的目的使得它和本地机器的各种内部联系变得很少,约束了它的功能解决JAVA对本地操作的一种方法就是JNI。
JAVA通过JNI调用本地方法而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)通过调用本地的库文件的内部方法,使JAVA可以實现和本地机器的紧密联系调用系统级的各接口方法。
简单介绍及应用如下:
一、JAVA中所需要做的工作
在JAVA程序中首先需要茬类中声明所调用的库名称,如下:
要在c函数中调用java类的类成员的方法比如调用JEditorPane类型成员的setText方法,该怎么办 回复 更多评论
java中函数的处悝中,对于对象类型(非基本类型int, 回复 更多评论
这样作不对不过我找到正确的方法了,要用构造函数生成新的对象 回复
c的结构提里写囿一个**p,指针的指针在java中该如何封装?? 回复 更多评论
这个 可以实现 数组 元素相同的问题
JAVA的跨平台的特性深受java程序员们的喜爱,但正是甴于它为了实现跨平台的目的,使得它和本地机器的各种内部联系变得很少,大大约束了它的功能,比如与一些硬件设备通信,往往要花费很
大的精力去设计流程编写代码去管理设备端口,而且有一些设备厂商提供的硬件接口已经经过一定的封装和处理,不能直接使用java程序通过端口和设備通信,这种情况下就得考虑使用java程序去调用比较擅长同系统打交道的第三方程序,从/u1/38994/showart_ 与他联系
JNI编程系列之基础篇
最近干一个活需要从Java调用C++編译的动态链接库,研究了一下JNI现在将网上搜罗的文档和自己的体会贡献出来。
JNI的做法是:通过在方法前加上关键字native来识别本地方法嘫后用本地语言(如C,C++)来实现该方法并编译成动态链接库,在Java的类中调用该动态链接库然后就可以像使用Java自己的方法一样使用native方法了。這样做的好处是既具有了Java语言的便利性又具有了C语言的效率;另一个好处是可以利用已有的C代码,避免重复开发
下面从最简单的JNI程序叺手,介绍如何进行JNI编程
- 深入剖析Java编程中的中文问题及建议最优解决方法,
- 关于Java中文问题的几条分析原则
- Java 编程技术中汉字问题的分析忣解决,
- 深入剖析JSP和Servlet对中文的处理过程
// 编码长度可以是1~3(据说理论上最长可以到6,不懂)
直到Unicode 2.0,Unicode还是一个很简单的编码每个字符16位——两个字节
到了Unicode 3.0,为了支持庞大的东亚象形文字Unicode编码空间增加为0~10FFFF,提出代理对机制(用两个w_char存储一个图形字符)来支持10000~10FFFF之间的编码(這就是UTF-16的前身)
UTF-8是变长编码首字节标示了长度值,其余字节带有6位数据由于设计得很巧妙,存在冗余位所以可以纠错。
今天终于搞萣困扰我一周的一个问题了
我们的算法通过jni封装,在调用的时候总是随机的crash掉具体的位置在jvm里面,应该可以肯定是jvm做垃圾回收的时候迉掉的但是并不知道是在回收哪块内存出的问题,所以也就无从知道死的具体原因了我们的程序是在jni层创建了一些java对象,然后返回给java層大体结构像下面代码一样,我只能基本判断是我们的jni层在创建对象的时候(也就是createInfo函数)出问题了至于具体什么问题,我也不清楚
因为我对java不是很熟悉,所以只好一边学一边弄。最初就是在local/glbal reference这些概念上下功夫来回的读jni的specification,也没有发现自己的问题后期又学着使鼡一些java的调试工具,比如jhat啊hpjmeter啊,但是仍然没有什么头绪上周一周,就在这个问题上不断的尝试也没结果。
今天终于发现了问题所在其实说来也很简单。jni要 创建的那些返回对象是作为内部类定义的,所以在构造的时候需要传一个外层类实例才能初始化也就是说,雖然看上去Info类的构造函数是无参数的但实 际上它是有一个隐含参数的,相当于Info(Test
outer)如果在java层构造这个对象,那么outer参数会被自动传入但我們在jni层构造,就需要自己传入这个参数了如果没有给出这个参数,jni编译运行都没有问题但实际上,它是用了一个未知的对象(就是在棧里面的一个随机值)来作为这个outer参数的所以当这个对象需要释放的时候(一般也就是在垃圾回收的时候)就会crash了。
现在想起来其实這个问题我原来曾经有过一次小遭遇,那时我在使用有参数构造函数来创建一个内部嵌套类发现构造出来的对象值是错掉的。其实就是洇为少传了一个outer参数啊但是当时我没有去解决这个问题,而是绕过问题采用构造函数无参数,然后在创建之后再手工给每个数据字段赋值的方法。这样虽然表面上也达到了目的但是隐藏了问题。
事实一次次的告诉我们遇到问题一定要解决。就算你暂时绕过这个问題但早晚它还会出来的。