使用 jna 从 java 调用 c++ main 方法

invoke c++ main method from java using jna

我正在尝试在 mac/unix 环境中使用 JNA 从 java 调用 c++ 方法。

我有两个问题。

  1. 到目前为止,我可以成功实现简单的示例,但我不确定如何为以下内容编写 java 对应部分 C++ 方法:

    int main(int argc, char* argv[]){...}
    

Java 我试过的代码

public interface CTest extends Library {
        int main(int argc, Pointer argv);
    }

给予

java.lang.UnsatisfiedLinkError: 查找函数时出错 'main': dlsym(0x7fdee8c39300, main): 找不到符号

也尝试了以下

public interface CTest extends Library {
        int main(int argc, Object... argv[]);
        //doesnt work either - int main(int argc, String argv);
    }

无济于事。相同的问题 - 找不到符号。 有小费吗? 最终我需要做这样的事情:

    CTest ctest = (CTest) Native.loadLibrary("ctest", CTest.class);
    String obj[] = new String[]{"-v, filepath/file"};
    ctest.main(2, obj);
  1. 第二个问题是关于在多线程环境中实现上述内容。我可能有多个图书馆位于不同的位置,所以 System.setProperty("jna.library.path",path-to-dylib) 不会工作。我怎样才能做到这一点?

好吧,我自己想出来了,希望能得到一个快速的答案,但无论如何。 这是解决方案:

A​​nswer-1 : 下面是我的接口方法

    public interface CTest extends Library {
        public int main(int arc, String[] argv);
    }

答案 2:这就是我计划处理多线程的方式

    String argv[] = {"-v","path-to-file/file.extension"};
    System.load(this.getClass().getResource("libmylib.dylib").getFile());
    //load a different library later if required.. this way multiple threads load respective libs when/what they want
    HelloJNA.CTest ctest = (HelloJNA.CTest) Native.loadLibrary("mylib", HelloJNA.CTest.class);

希望对您有所帮助。