说明
当需要java调用c代码时,如果不想用jni技术,可考虑将数据存储为文本格式。但考虑到c处理字符串过于繁琐,比如就没有类似的split函数方法。同时你需要处理的东西统统都是数值类型的时候,不妨将数据都转化为二进制的格式。或许更进一步转化为json格式.
代码
这里是定义了一个数据结构,用于处理数据
//c代码
struct LonglyRiceInput{
double KWX ;
double MDP;
double DIST[201][201];
double ELEV[201][201];
double HG[2];
double WN;
double EN0;
double GME;
double ZGND;
double KLIM;
double EPS;
double SGM;
};
int myread(LonglyRiceInput & in)
{
FILE * fd = fopen("D:\\workspace\\net\\input","rb");
if ( fd != NULL)
{
//fread(&in.HG, sizeof(double),2,fd);
fread(&in.HG, sizeof(unsigned char) * 8, 2, fd);
fread(&in.WN, sizeof(unsigned char) * 8, 1, fd);
fread(&in.EN0, sizeof(unsigned char) * 8, 1, fd);
fread(&in.GME, sizeof(unsigned char) * 8, 1, fd);
fread(&in.ZGND, sizeof(unsigned char) * 8, 1, fd);
fread(&in.KLIM, sizeof(unsigned char) * 8, 1, fd);
fread(&in.EPS, sizeof(unsigned char) * 8, 1, fd);
fread(&in.SGM, sizeof(unsigned char) * 8 ,1, fd);
}
else
{
return 0;
}
if( fd != NULL)
{
fclose(fd);
}
return 1;
}
//java 代码
package wifimodel;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
public class TestBinary {
public static byte[] double2Bytes(double d) {
long value = Double.doubleToRawLongBits(d);
byte[] byteRet = new byte[8];
for (int i = 0; i < 8; i++) {
byteRet[i] = (byte) ((value >> 8 * i) & 0xff);
}
return byteRet;
}
public static class LonglyRiceInput{
double KWX ;
double MDP;
double DIST[][];
double ELEV[][];
double HG[];
double WN;
double EN0;
double GME;
double ZGND;
double KLIM;
double EPS;
double SGM;
};
public static void addByteList(List<Byte> dataList, double v){
byte[] bytes = double2Bytes(v);
for( int i = 0; i < bytes.length; i ++){
dataList.add(bytes[i]);
}
return;
}
public static byte[] toByteArrs(List<Byte> dataList){
byte[] ret = new byte[dataList.size()];
for( int i = 0 ; i < dataList.size(); i ++){
ret[i] = dataList.get(i);
}
return ret;
}
@Test
public void testBinary() throws IOException {
Double v = 20.0;
System.out.println(Arrays.toString(double2Bytes(v)));
LonglyRiceInput in = new LonglyRiceInput();
in.HG = new double[]{12.3,0.12345678};
in.WN = 13.0;
in.EN0 = 172222.0;
in.GME = 9.0;
in.ZGND = 1.0;
in.KLIM = 172.01333;
in.EPS = 9898989.43;
in.SGM = 9988.129222;
List<Byte> dataList = new ArrayList<Byte>();
addByteList(dataList, in.HG[0]);
addByteList(dataList, in.HG[1]);
addByteList(dataList, in.WN);
addByteList(dataList, in.EN0);
addByteList(dataList, in.GME);
addByteList(dataList, in.ZGND);
addByteList(dataList, in.KLIM);
addByteList(dataList, in.EPS);
addByteList(dataList, in.SGM);
addByteList(dataList, in.KLIM);
addByteList(dataList, in.EPS);
addByteList(dataList, in.SGM);
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
byteOut.write(toByteArrs(dataList));
FileOutputStream fstream = new FileOutputStream("D:\\workspace\\net\\input", true);
byteOut.writeTo(fstream);
fstream.flush();
fstream.close();
}
}