java访问本机代码【调用C、C++类库】

背景介绍

由于 java 的跨平台和可移植性,没有c、c++好,因此,由c、c++来提供高可移植性和跨平台性的类库供各种平台和语言来调用提供的接口,实现请求转发和调用底层驱动。
编写的dll类库文件主要用于Linux和windows98及windowXp以上平台中方便于Delphi、VB、C#、java等语言编写的界面来调用提供的接口。

java调用dll接口产生的问题及处理总结

调用dll类库导致应用崩溃

这种问题主要分两种情况,一种是c++类库内部崩溃,另一种是java和C++类库接口传入和转换类库返回的值导致崩溃的

c++类库内部崩溃

这种问题,多因指针和数据内存泄露导致,各种代码情况很多

传入参数开辟的空间不足,而 c++ 程序中 使用超出了分配的空间,

比如:

    java 代码中:

    byte[] name = new byte[20];

    调用dll接口

    c++  代码中:

    strncpy((char*) name, response.memberInfo.name.c_str(), 30);


上述这种问题,是我犯过的错误,花费了不少调试时间才找出来原因;由于定义java变量的时候,疏忽了,导致这种问题,
在java调用dll类库运行时就会使得java应用崩溃,实际原因是c++内部崩溃,耗费时间调试查找原因,而且很难想到,因为
strncpy这种简单的操作很容易忽略,认为不会出问题

java和c++类库接口传入和传出参数转换不当

(一)接口参数类型对应

1.值类型参数

java                                         c、c++          

NativeLong                                    long
short                                         short
int                                           int          
long                                          long long, __int64
float                                         float
double                                        double
boolean                                       int
byte                                          char

2.指针类型参数

java 使用 jna.jar 包中的 com.sun.jna.ptr 包中的相关数据类型

java                                         c、c++          

ShortByReference                             short*           
IntByReference                                int*            
NativeLongReference/LongByReference          long*            
FloatByReference                             float*           
DoubleByReference                            double*          
ByteByReference                              byte*            
byte[]                                       char*/uchar*/byte*
String                                       char*/uchar*     
PointerByReference                           二维数组(指针的指针)


传入参数: 

java                                        c、c++

Native.toByteArray(String values)           char*/uchar*

(二)取到传出参数值

1.值类型参数

variable.getValue()

2.指针类型参数

java程序中 的  byte[] 类型的变量 获取值 的问题:
    Native.toString(变量)    而    变量.toString()   输出的 结果是 该变量的内存地址 而非 我们所想要的值
使用 变量.toString() 出现的现象:
     取值不完整或取不到,也可能取到内存地址

总结

一般的容易出问题而且出问题最多的就是 java 和 c++ 接口 调用的时候,而且,很多是 由于 java 代码而导致的问题,因此首先和 c++ 提供的接口声明对比,查找 java 相关代码的问题排查


参考资料

JNA—JNI终结者