Java JNA结构数据是垃圾值 #########interface.c文件 typedef struct{ int col_size; char* data; }J_ROW_DATA; typedef struct{ int col_cnt; J_ROW_DATA* col; }J_ROW; // Struct void jreplace(J_ROW* row) { R2WR_ROW src; // our struct R2WR_ROW dst; int col_cnt = row->col_cnt; int rv,j,i; memset( &src, 0x00, sizeof(R2WR_ROW) ); for( j = 0; j < col_cnt; j++ ) { src.col = (R2WR_COL*)realloc( src.col, sizeof(R2WR_COL)*(j+1) ); if( !src.col ) { printf("Memory allocation failed.<%d>\n", j); break; } memset( &(src.col[j]), 0x00, sizeof(R2WR_COL) ); ///// ....... ///// row->col[x].data setting }

Java JNA结构数据是垃圾值 #########interface.c文件 typedef struct{ int col_size; char* data; }J_ROW_DATA; typedef struct{ int col_cnt; J_ROW_DATA* col; }J_ROW; // Struct void jreplace(J_ROW* row) { R2WR_ROW src; // our struct R2WR_ROW dst; int col_cnt = row->col_cnt; int rv,j,i; memset( &src, 0x00, sizeof(R2WR_ROW) ); for( j = 0; j < col_cnt; j++ ) { src.col = (R2WR_COL*)realloc( src.col, sizeof(R2WR_COL)*(j+1) ); if( !src.col ) { printf("Memory allocation failed.<%d>\n", j); break; } memset( &(src.col[j]), 0x00, sizeof(R2WR_COL) ); ///// ....... ///// row->col[x].data setting },java,struct,jna,Java,Struct,Jna,} //这是declar结构 /* other source */ ArrayList<Object> transArray = null; CLibrary.J_ROW.ByReference data = new CLibrary.J_ROW.ByReference(); data.col_cnt = colarray.size(); data.col = new CLibrary.J_ROW_DATA.ByReference();

}

//这是declar结构

    /* other source */
    ArrayList<Object> transArray = null;
    CLibrary.J_ROW.ByReference data = new CLibrary.J_ROW.ByReference();
    data.col_cnt = colarray.size();
    data.col = new CLibrary.J_ROW_DATA.ByReference();
    CLibrary.J_ROW_DATA[] cols = (CLibrary.J_ROW_DATA[])data.col.toArray(data.col_cnt);
    for(int i = 0; i < data.col_cnt; i++)
    {
        byte[] tempbyte= null;
        if(colarray.get(i) == null){
            tempbyte = new byte[0];
            cols[i].col_size = 0;
        }
        else{
            tempbyte = colarray.get(i);
            cols[i].col_size = tempbyte.length;
        }
        ByteBuffer buf = ByteBuffer.allocateDirect(tempbyte.length);
        buf.put(tempbyte);
        buf.rewind();
        cols[i].data = Native.getDirectBufferPointer(buf);    

    }  // this is Java to C pass Structure member
     CLibrary.INSTANCE.jreplace(data); // C Library call 
     transArray = getObjList(data ,md);  // byte to Object
/*其他来源*/
ArrayList transArray=null;
CLibrary.J_ROW.ByReference data=new CLibrary.J_ROW.ByReference();
data.col_cnt=colarray.size();
data.col=new CLibrary.J_ROW_data.ByReference();
CLibrary.J_ROW_DATA[]cols=(CLibrary.J_ROW_DATA[])DATA.col.toArray(DATA.col_cnt);
对于(int i=0;i
///////////////////////////////////////////////////////////////////////////////////

  private ArrayList<Object> getObjList(CLibrary.J_ROW.ByReference row, ResultSetMetaDatamd)throws SQLException
{
    ArrayList<Object> tmp = new ArrayList<Object>();
    int size = row.col_cnt;   
    CLibrary.J_ROW_DATA[] cols = (CLibrary.J_ROW_DATA[])row.col.toArray(row.col_cnt);
    for(int j = 0; j < size; j++)
    {
        byte[] column = cols[j].data.getByteArray(0, cols[j].col_size);
        // Problem  
        // column value is not expected  
        // for example, 1.  printf value in interface.c file is  [223] , but  get value after getByteArray is []  and value size is 3 
        // 2. interface.c file printf value is [3232] , but column value is [8*5?] 
private ArrayList getObjList(CLibrary.J_ROW.ByReference ROW,ResultSetMetaDatamd)抛出SQLException
{
ArrayList tmp=新的ArrayList();
int size=row.col\u cnt;
CLibrary.J_ROW_DATA[]cols=(CLibrary.J_ROW_DATA[])ROW.col.toArray(ROW.col_cnt);
对于(int j=0;j typedef struct{
    int col_size;
    char* data;
 }J_ROW_DATA;
 typedef struct{
    int col_cnt;
    J_ROW_DATA* col;
 }J_ROW;
// Struct 

void jreplace(J_ROW* row)
{
    R2WR_ROW src;  // our struct 
    R2WR_ROW dst;
    int col_cnt = row->col_cnt;
    int rv,j,i;
    memset( &src, 0x00, sizeof(R2WR_ROW) );
    for( j = 0; j < col_cnt; j++ ) {
            src.col = (R2WR_COL*)realloc( src.col, sizeof(R2WR_COL)*(j+1) );
    if( !src.col ) {
                    printf("Memory allocation failed.<%d>\n", j);
        break;
    }
    memset( &(src.col[j]), 0x00, sizeof(R2WR_COL) );
         ///// .......
        ///// row->col[x].data setting




  }
//2.interface.c文件printf值为[3232],但列值为[8*5?]
 typedef struct{
    int col_size;
    char* data;
 }J_ROW_DATA;
 typedef struct{
    int col_cnt;
    J_ROW_DATA* col;
 }J_ROW;
// Struct 

void jreplace(J_ROW* row)
{
    R2WR_ROW src;  // our struct 
    R2WR_ROW dst;
    int col_cnt = row->col_cnt;
    int rv,j,i;
    memset( &src, 0x00, sizeof(R2WR_ROW) );
    for( j = 0; j < col_cnt; j++ ) {
            src.col = (R2WR_COL*)realloc( src.col, sizeof(R2WR_COL)*(j+1) );
    if( !src.col ) {
                    printf("Memory allocation failed.<%d>\n", j);
        break;
    }
    memset( &(src.col[j]), 0x00, sizeof(R2WR_COL) );
         ///// .......
        ///// row->col[x].data setting




  }
这并不总是发生的,有时确实会得到价值

测试数据计数为10000000 它发生随机重复计数。。。
我应该怎么做?

ByteBuffer buf=ByteBuffer.allocateDirect(tempbyte.length);…cols[i].data=Native.getDirectBufferPointer(buf)
一旦您再次循环,缓冲区就会被销毁..指向缓冲区的指针因此无效..另一件事是,我无法理解您试图解释的内容..到底是什么问题?java到c没有问题,问题是byte[]column=cols[j].data.getByteArray(0,cols[j].colu size)此上下文jna interface.c文件-->printf data=[200]但列getByteArray在java data=[]之后,数据大小为4,但数据为[]…我的英语技能不好..抱歉..;请包含这些结构的C声明。然后答案将是显而易见的。C结构添加解释。这个问题并不总是发生,有时不会发生问题..插入java选项后不会发生-Xms1024m-Xmx1024m。。。。。。。。。