输入不匹配 JNA

Input Mismatch JNA

在使用 JNA 时,我遇到了一个非常奇怪的问题。 这是我的 C++ 代码。 -- 为简单起见减少 --

#include <iostream>

extern "C" std::string func(int, int, int, double*, double*);

std::string func(int a, int b, int c, double* data1, double* data2) {
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
    return "Finished";
}

这里是 Java class:

class CLibOperator {
    interface CLib extends Library {
        CLib INSTANCE = 
            (CLib) Native.loadLibrary("libFile.so", CLib.class);

        String func(int a, int b, int c, double[] data1, double[] data2);
    }

    public static void main(String[] args) {
        double[] d1 = {10,20,30};
        double[] d2 = {111,222,333,444,555,666,777};
        CLib.INSTANCE.func(1, 2, 3, d1, d2);
    }
}

然而,C 函数的输出是:

2
3
3856103913

我期望的是:

1
2
3

似乎第一个参数被完全忽略了。关于如何解决这个问题有什么想法吗?

您正在尝试从指定了 C 链接 (extern "C") 的函数中 return std::string。我很惊讶你的编译器没有就此向你抱怨。当按值 returning 结构或 类 时,编译器(当然,取决于编译器和它使用的 ABI)生成的代码基本上等于传递给调用者的结构是很常见的作为传递给函数的指针作为参数。

将 return 类型更改为 const char *

extern "C" const char *func(int, int, int, double *, double *);

您可能也有兴趣阅读:Functions with C linkage able to return class type?