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 }
} //这是declar结构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();
/* 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。。。。。。。。。