From what I understood dll are not standardized. thus one cannot just call something in a dll.
However I found this :http://johannburkard.de/software/nativecall/
This library allow you to call any method from a dll in java, so it seems that you can call any method in a dll.
but it was done for 32 bit system, thus I cannot use it.
I have this dll, autohotkey.dll, I know there is the method "ahkExec" inside which take a String as parameter.
Is this really not possible to run it from java without using some kind of c++ magic?
Thanks.
ps : here is how it is done with nativeCall : https://gist.github.com/brigand/1526712
You've been able to call DLLs in Java since version 1.0 using Java Native Interface (JNI).
There is no magic in invoking external methods but you have to follow some rules based on what JNI provides .
If you need to use one function from library you could write a specific Wrapper-class like in this tutorial
For more tricky things better to work with SWIG
Related
I have a jni dll that has functions being called from java. The problem is that this dll has all the java classes in the default package (in the dll "Java_classname_methodname"). It is impossible to get the source of this dll and it would take EXTREMELY long to rewrite. So I basically need to call the functions in this dll from java in a different package than default. I've tried for hours on end to rename the functions in the dll with a hex editor and several tools to modify the checksum and addresses in the dll but it's just too much for me because I have almost no experience with this. I would very much prefer this route, but I just don't have the proper tools or the know-how. So what I'm left with is trying to hardcode the package name in java. I tried using jna as described in this stack overflow post to do something like this:
Map options = new HashMap();
options.
put(
Library.OPTION_FUNCTION_MAPPER,
new StdCallFunctionMapper() {
public String getFunctionName(NativeLibrary library, Method method) {
method.setName(method.getName().replace("com.test.", "");
return super.getFunctionName(library, method);
}
}
);
Native.loadLibrary(..., ..., options);
But there is no setName in Method. Ideally I'd like to get this done without any extra libraries but I'm obviously not opposed to using something like jna. And before anyone asks, yes this is permitted by the library's usage license. Please don't tell me it's not possible because know that it's possible, just difficult. Whichever way it must be done I am willing to put in the work (either modifying dll or using java code with some external library). And by the way, I also need this done on .so and .dylib files eventually (not as important as dll). Thank you for your time.
I have a JNI dll that has functions being called from java. The problem is that this DLL has all the java classes in the default package (in the dll "Java_classname_methodname").
So the corresponding Java class with the native methods wasn't in a package either.
It is impossible to get the source of this dll and it would take EXTREMELY long to rewrite. So I basically need to call the functions in this dll from java in a different package than default.
Correct.
I've tried for hours on end to rename the functions in the dll with a hex editor and several tools to modify the checksum and addresses in the dll but it's just too much for me because I have almost no experience with this.
You may be able to alias the function names somehow, but it's been about 20 years since I practiced in this area.
I would very much prefer this route, but I just don't have the proper tools or the know-how. So what I'm left with is trying to hardcode the package name in java.
No. There is no package name to hard-code. What you're left with is trying to call native methods in a class without a package from a class in a package, which since 1.4 is not possible.
What you need to to do is either:
It is possible to call the package-less Java native methods via reflection. So, you can write a wrapper class that does that, which lives in the package of your choice, and the rest of your code can call the wrapper.
Or
As follows:
Write another Java class in the package of your choice with the appropriate native methods.
Create an import library from the existing DLL.
Write another DLL and link it with this import library.
Load this new DLL from your Java code.
Have this DLL use the RegisterNatives method on initialization, to register the existing JNI entry points in the old DLL under the new native method names & signatures.
Use javah to get the required native method names and javap to get the required Java signatures. Don't try to guess them by hand.
Don't ask me how this maps to .so files.
I have an existing .c and .h file from a library. I would like to be able to call the functions contained within the c files from Java. I understand that this requires the JNI, and I have a pretty good understanding of how I will need to modify the .c and .h files in order to make them work with the JNI. What I don't fully understand how to do, or if it's even the purpose of the JNI, is to make a simple JNI library that I can then wrap into another java application. I want to create the interface; extend the C API into Java so I can use it there. The final result would be something like: someCmethodInSomeJNILibrary() located in some jnilib sort of file.
Thanks in advance
First, you may wish to consider using JNA. JNA would allow you to interact without writing additional native code. This is particularly convenient if you already have a library and don't want to build another.
With JNI, the steps required include:
Design a Java API of native methods for interacting with the C code.
Use javah to generate C stubs for the Java native methods.
Glue the C stubs to your C code.
Generate a dynamic/shared library containing the native method functions and your original C code.
Load that shared library in Java.
More detail can be found in "Compiling, Loading, and Linking Native Methods" in the JNI documentation.
I was wondering if there is a Java method for injecting code into a process during runtime.
The key term; in Java. I have found alot of references to this (the most useful being at this website). The problem is that that all the references I've found do not use Java, and hence are unfavorable for my current situation.
Could anyone help me out, and perhaps point me in the right direction?
You can use Java Native Interface to bind CreateRemoteThread() API to Java.
The closest I know of is System.loadLibrary. That method will load a library by name in a system dependent way.
One way would be to load the non java library you found using Java Native Access. I don't really see a way you will be able to do this without calling native code so unless a some other java developer has already created a JNI or JNA wrapper you will probably have to do it yourself.
I am working to call native methods via Java/JNI, in Windows. The basics are fine. My problem is that I do not know the exact method signature of one of the methods. I have its name.
Does anyone know of a way to get the exported methods and signatures from a loaded DLL from the Java side?
No, all you get from JNI naming convention is the name of exported function - and even this on condition that the library is not using RegisterNatives(). You also know that the first two parameters are pointers. From here, you can try to disassemble the function as you would for any other undocumented exported function.
The question is whether can I create an instance of class (which is situated in .dll and has written in Delphi) and call method from it using Java.
I have found a lot of solutions about how to call native routines or methods in Java. What about classes?
One of the easiest is using JNA project. You'd have to create a set of functions in your DLL which could be called. Alternatively you can create a wrapper DLL if original cannot be changed