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

时间:2017-09-21 16:48:28

标签: java java-native-interface jna

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

我有两个问题。

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

    int main(int argc, char* argv[]){...}
    
  2. 我试过的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) 不会工作。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

好的,我自己想出来了,希望快速回答​​,不管怎样。 这是解决方案:

答案-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);

希望这有帮助。