Java JNA。char*它不包含结果
我有带有外部C方法的dll:Java JNA。char*它不包含结果,java,c++,c,reference,jna,Java,C++,C,Reference,Jna,我有带有外部C方法的dll: extern "C" { int ADAPTERSHARED_EXPORT full_hash(unsigned char* data, uint64_t size, int algorithm, char* result, int *res_size ); } 从java调用此方法 接口 public interface CA extends Library { CA INSTANCE = (CA) Na
extern "C" {
int ADAPTERSHARED_EXPORT full_hash(unsigned char* data,
uint64_t size,
int algorithm,
char* result,
int *res_size
);
}
从java调用此方法
接口
public interface CA extends Library {
CA INSTANCE = (CA) Native.loadLibrary(
(Platform.isWindows() ? "HashAdapterC" : "libHAL"), CA.class);
int full_hash(byte[] data, long size, int algorithm, String result, IntByReference res_size);
}
主要方法
public static void main(String[] args) {
logger.debug("being started");
try {
CA lib = CA.INSTANCE;
String str = "1234567";
String res = "";
IntByReference in = new IntByReference(32);
byte[] data = str.getBytes();
int i = lib.full_hash(data, str.length(), 3, res, in);
logger.debug("result = " + res);
logger.debug("error = " + i);
return;
} catch (Exception e) {
e.printStackTrace();
logger.error("err");
return;
}
}
调用空字符串的结果后
如果从C调用它
unsigned char data[] = {
0xB1, 0x94, 0xBA, 0xC8, 0x0A, 0x08, 0xF5, 0x3B,
0x36, 0x6D, 0x00, 0x8E, 0x58
};
uint64_t size = sizeof(data);
int res_size = 32;
char* result = (char*)malloc(res_size);
int is_success = hash(data, size, 3, result, &res_size);
if (is_success == 0)
{
printf("Success\n");
int i;
for (i = 0; i < res_size; ++i)
{
printf("%X", (unsigned char)result[i]);
}
printf("\n");
}
无符号字符数据[]={
0xB1、0x94、0xBA、0xC8、0x0A、0x08、0xF5、0x3B、,
0x36、0x6D、0x00、0x8E、0x58
};
uint64_t size=sizeof(数据);
int res_size=32;
char*result=(char*)malloc(res_size);
int是_success=hash(数据、大小、3、结果和大小);
if(is_success==0)
{
printf(“成功”\n);
int i;
对于(i=0;i
我得到结果字符串
这不是char*-字符串吗?还是使用其他类型?必须将结果声明为字节[]
public interface CA extends Library {
CA INSTANCE = (CA) Native.loadLibrary(
(Platform.isWindows() ? "HashAdapterC" : "libHAL"), CA.class);
int full_hash(byte[] data, long size, int algorithm, byte[] result, IntByReference res_size);
}
正如您使用的
str.getBytes()
若要将字符串传递给DLL,必须将数据结果接收到字符数组中。然后将其转换为String
。Java字符串类型不是一个简单的带有空终止符的字符数组,就像字符串的约定一样。感谢您,它确实在工作)从根本上说,结果需要是一个缓冲区char*
与const char*
不同。