hans_castorp Posted January 31, 2020 Posted January 31, 2020 Hello, I am writing a EXE launcher for a Java application using AutoIt. It works fine when starting Java through ShellExecute, but for several reasons I would like to call it through the DLL (so that I don't create a separate process) But I can't figure out how to provided the needed DLL struct for the call. The problem is, that it's a nested struct, where the nested element is an array of char* pointers. The JDK documentation contains an example: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#JNI_CreateJavaV JavaVMInitArgs vm_args; JavaVMOption options[4]; // Defining the array and filling the elements is the part I don't know how to do with AutoIt // (Don't mind the content here) options[0].optionString = "-Djava.compiler=NONE"; /* disable JIT */ options[1].optionString = "-Djava.class.path=c:\myclasses"; /* user classes */ options[2].optionString = "-Djava.library.path=c:\mylibs"; /* set native library path */ options[3].optionString = "-verbose:jni"; /* print JNI-related messages */ vm_args.version = JNI_VERSION_1_2; vm_args.options = options; vm_args.nOptions = 4; vm_args.ignoreUnrecognized = TRUE; res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args); The two structs are defined this way: typedef struct JavaVMOption { char *optionString; void *extraInfo; } JavaVMOption; typedef struct JavaVMInitArgs { jint version; jint nOptions; JavaVMOption *options; jboolean ignoreUnrecognized; } JavaVMInitArgs; This is what I came up with so far: Local $optionArray[2] $optionArray[0] = "-cp MyApp.jar" $optionArray[1] = "MyMain" $env = 0 $option = DllStructCreate("struct;char* optionString;ptr extraInfo;endstruct") $vmInitArgs = DllStructCreate("struct;LONG version;LONG nOptions;ptr options;BOOLEAN ignoreUnrecognized;endstruct") ; Not sure if this is correct DllStructSetData($option, "optionString", $optionArray) DllStructSetData($vmInitArgs, "version", 0x00010008) DllStructSetData($vmInitArgs, "nOptions", 2) DllStructSetData($vmInitArgs, "options", DllStructGetPtr($option)) DllStructSetData($vmInitArgs, "ignoreUnrecognized", 1) Local $handle = DllOpen($dllPath) $res = DllCall($handle, "INT", "JNI_CreateJavaVM", "ptr*", $env, "ptr", DllStructGetPtr($vmInitArgs)) ConsoleWrite("*** Error: " & @error & @CRLF) ConsoleWrite("*** Result: " & $res[0] & @CRLF) DllClose($handle) I also tried calling DllStructSetData with an index number rather than the "member name". I also tried calling DllStructCreate without the "struct/endstruct" markers and without the member names. The @error code is always 0, but $res[0] contains an error code (-3) which in theory indicates that the JNI version is incorrect, but most answers I found indicate that this can also mean the JavaVMInitArgs struct was not populated correctly. I have no experience with C/C++ programming so I am at a loss with mapping the information from the Java docs to AutoIt Any ideas? Thanks in advance
faustf Posted May 1, 2020 Posted May 1, 2020 but sorry you dont can create exe directly by java ? without using autoi ?
hans_castorp Posted May 3, 2020 Author Posted May 3, 2020 Because Java can't create native Windows .exe files. And I want a custom launcher to run my Java application that can download a Java VM if none was found. It was quite easy to do that using AutoIt and starting Java through ShellExecuteWait(). But that creates two processes and for several reasons I would like to only have a single process.
faustf Posted May 3, 2020 Posted May 3, 2020 https://stackoverflow.com/questions/2011664/compiling-a-java-program-into-an-executable
hans_castorp Posted May 9, 2020 Author Posted May 9, 2020 I know those alternatives, but none of them let me e.g. customize the download. That's why I decided to write my own - and it was really easy using AutoIt, but I had to use ShellExecuteWait() and I would rather only have a single process. But it seems that I need to ditch AutoIt anyway as the generated .exe is being reported by multiple anti-virus programs and my users start complaining.
hans_castorp Posted June 9, 2020 Author Posted June 9, 2020 I am aware that it's a false positive, but my tool has about 20.000 downloads per month, and I can't tell everybody to manually upload the files. What's even worse, that some browsers refuse to download the ZIP archive with the generated EXE completely, so those users don't even have the chance to report it as a false positive. So I decided to abandon AutoIt completely. I will check back if this is fixed in a future release.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now