将参数传递给DLL';s主Java

将参数传递给DLL';s主Java,java,java-native-interface,Java,Java Native Interface,如何通过JNI将参数传递给Main 目前,我加载DLL的方式如下: class SharedLibrary { native void GetBuffer(ByteBuffer Buffer);; SharedLibrary(String[] exec_args) { String path = new File(exec_args[0]).getAbsolutePath(); System.load(path); //Load My DLL

如何通过JNI将参数传递给Main

目前,我加载DLL的方式如下:

class SharedLibrary {

    native void GetBuffer(ByteBuffer Buffer);;

    SharedLibrary(String[] exec_args) {
        String path = new File(exec_args[0]).getAbsolutePath();
        System.load(path);  //Load My DLL. I want to Pass this DLL some arguments.

        ByteBuffer Foo = ByteBuffer.allocateDirect(.....);
        GetBuffer(Foo);
    }
}

如何传递DLL参数?我需要传递多个参数。

将库加载到Java中的目的是实现使用
native
属性声明的Java方法,例如
native void methodname(\u参数在此处\u)。您可以在一个类中声明一个或多个本机方法,但所有本机方法都应该在DLL中定义(使用JNI标准)。在Java中,您可以像调用任何其他方法一样调用它们(通过使用为该方法定义的任何参数)


如果您希望DLL的初始化入口点接收数据元素,则需要使它们成为某个类的静态成员(或方法),并且DLL需要知道如何访问该类才能获取它们。然而,这将是非常不正常的,并且可能不是执行您希望执行的任何操作的最佳方式。

将库加载到Java中的目的是实现使用
native
属性声明的Java方法,例如
native void methodname(\u参数位于此处)。您可以在一个类中声明一个或多个本机方法,但所有本机方法都应该在DLL中定义(使用JNI标准)。在Java中,您可以像调用任何其他方法一样调用它们(通过使用为该方法定义的任何参数)


如果您希望DLL的初始化入口点接收数据元素,则需要使它们成为某个类的静态成员(或方法),并且DLL需要知道如何访问该类才能获取它们。然而,这将是非常不正常的,并且可能不是执行您希望执行的任何操作的最佳方式。

好吧,如果您需要“多个参数”,任何现有的“dll main”都不适用于您。您很可能指的是,并且您可能认为此函数对于任何DLL都是必需的,这与每个C可执行文件都应该具有
main()
函数的方式大致相同。事实并非如此。特别是JNI,它不接受任何参数,但DllMain没有任何用户可定义的“多个参数”。如果您需要自己的参数,为什么不能创建一个初始化方法?甚至连
DllMain
doc都建议这样做
DllMain
的功能非常有限。将JNI init方法设置为静态,以便在Java中实例化
SharedLibrary
对象之前调用它。有什么问题吗?告诉你一些你非常需要的“多个参数”。

好吧,如果你需要“多个参数”,任何现有的“dll main”都不适合你。您很可能指的是,并且您可能认为此函数对于任何DLL都是必需的,这与每个C可执行文件都应该具有
main()
函数的方式大致相同。事实并非如此。特别是JNI,它不接受任何参数,但DllMain没有任何用户可定义的“多个参数”。如果您需要自己的参数,为什么不能创建一个初始化方法?甚至连
DllMain
doc都建议这样做
DllMain
的功能非常有限。将JNI init方法设置为静态,以便在Java中实例化
SharedLibrary
对象之前调用它。有什么问题吗?告诉你一些你非常需要的“多个参数”。

当你运行DLL的方法时,你会传入参数。当你运行DLL的方法时,你会传入参数。所以答案基本上是否定的?换句话说,我无法将参数传递到DLL的主?我不想调用方法。我已经可以在调用GetBuffer函数时这样做了。我希望它在加载时传递参数,并用这些参数初始化DLL。我认为JNI的目的是实现不存在的东西和需要的东西:S@CantChooseUsernames:h3ll是什么“DLL的主”?DLL不是独立的程序,而是带有函数的库。如果您不打算调用DLL的函数,为什么还要使用它呢?这个问题没有多大意义。没有DLL的主要入口点的概念。当Java加载DLL时,它会在返回给您之前调用它的JNI_OnLoad()函数(如果存在),但是如果您检查该函数的方法,您会发现没有任何空间容纳您选择的任意参数。所以答案基本上是否定的?换句话说,我无法将参数传递到DLL的主?我不想调用方法。我已经可以在调用GetBuffer函数时这样做了。我希望它在加载时传递参数,并用这些参数初始化DLL。我认为JNI的目的是实现不存在的东西和需要的东西:S@CantChooseUsernames:h3ll是什么“DLL的主”?DLL不是独立的程序,而是带有函数的库。如果您不打算调用DLL的函数,为什么还要使用它呢?这个问题没有多大意义。没有DLL的主要入口点的概念。当Java加载DLL时,它将在返回给您之前调用其JNI_OnLoad()函数(如果存在),但是如果您检查该函数的方法,您将看到没有任何空间容纳您选择的任意参数。基本上,您知道如何使用参数运行程序吗?示例:在属性的目标行中,可以指定启动参数。Foo.exe-SomeParam-SomeParam2我正在尝试这样做:SDLL不是您运行的程序。它是一个库,一些程序将加载到内存中并使用其中的函数。库没有任何公共入口点,如program
main()
。按照惯例,只有某些入口点(如WinAPI DllMain)只能在有限的场景中工作。但即使是那些也不意味着传递任意参数。基本上你知道如何使用参数运行程序吗?例子:在t