Java JNA。char*它不包含结果

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

我有带有外部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) 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*
不同。