B-1_14-DEV merge back to main
This commit is contained in:
@@ -4,62 +4,71 @@ import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
import com.jacob.com.LibraryLoader;
|
||||
|
||||
/**
|
||||
* It is sometimes necessary to run Jacob without being able to install the dll
|
||||
* on the client machine. This is true in JavaWebStart (JWS) and possibly
|
||||
* Applet (assuming security allows access to the file system).
|
||||
* The obvious thing to do here is to jar up
|
||||
* the Jacob.dll so that it can be downloaded the client along with the rest
|
||||
* of the resources. This is simple except that the System.Load() function
|
||||
* does not search jar files for DLLs. It searches the classpath.
|
||||
* The work around to this problem is to write the DLL to a temporary file and then
|
||||
* on the client machine. This is true in JavaWebStart (JWS) and possibly Applet
|
||||
* (assuming security allows access to the file system). The obvious thing to do
|
||||
* here is to jar up the Jacob.dll so that it can be downloaded the client along
|
||||
* with the rest of the resources. This is simple except that the System.Load()
|
||||
* function does not search jar files for DLLs. It searches the classpath. The
|
||||
* work around to this problem is to write the DLL to a temporary file and then
|
||||
* explicitly load the DLL calling passing the full path to the temporary file.
|
||||
*
|
||||
* The following code demonstrates this idea.
|
||||
*
|
||||
* @author joe
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class DLLFromJARClassLoader {
|
||||
|
||||
/**
|
||||
* Load the DLL from the classpath rather than from the java path.
|
||||
* This code uses this class's class loader to find the dell in one
|
||||
* of the jar files in this class's class path. It then
|
||||
* writes the file as a temp file and calls Load() on the temp file.
|
||||
* The temporary file is marked to be deleted on exit so the dll
|
||||
* is deleted from the system when the application exits.
|
||||
* <p>
|
||||
* Derived from ample code found in Sun's java forums
|
||||
* <p.
|
||||
* @return true if the native library has loaded, false if there was a problem.
|
||||
*/
|
||||
public boolean loadLibrary()
|
||||
{
|
||||
try
|
||||
{
|
||||
//Finds a stream to the dll. Change path/class if necessary
|
||||
InputStream inputStream = getClass().getResource("/jacob.dll").openStream();
|
||||
//Change name if necessary
|
||||
File temporaryDll = File.createTempFile("jacob", ".dll");
|
||||
FileOutputStream outputStream = new FileOutputStream(temporaryDll);
|
||||
byte[] array = new byte[8192];
|
||||
for (int i = inputStream.read(array);
|
||||
i != -1;
|
||||
i = inputStream.read(array)) {
|
||||
outputStream.write(array, 0, i);
|
||||
}
|
||||
outputStream.close();
|
||||
temporaryDll.deleteOnExit();
|
||||
System.load(temporaryDll.getPath());
|
||||
return true;
|
||||
}
|
||||
catch(Throwable e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Load the DLL from the classpath rather than from the java path. This code
|
||||
* uses this class's class loader to find the dell in one of the jar files
|
||||
* in this class's class path. It then writes the file as a temp file and
|
||||
* calls Load() on the temp file. The temporary file is marked to be deleted
|
||||
* on exit so the dll is deleted from the system when the application exits.
|
||||
* <p>
|
||||
* Derived from ample code found in Sun's java forums <p.
|
||||
*
|
||||
* @return true if the native library has loaded, false if there was a
|
||||
* problem.
|
||||
*/
|
||||
public boolean loadLibrary() {
|
||||
try {
|
||||
// this assumes that the dll is in the root dir of the signed
|
||||
// jws jar file for this application.
|
||||
//
|
||||
// Starting in 1.14M6, the dll is named by platform and architecture
|
||||
// so the best thing to do is to ask the LibraryLoader what name we
|
||||
// expect.
|
||||
// this code might be different if you customize the name of
|
||||
// the jacob dll to match some custom naming convention
|
||||
InputStream inputStream = getClass().getResource(
|
||||
"/" + LibraryLoader.getPreferredDLLName() + ".dll")
|
||||
.openStream();
|
||||
// Put the DLL somewhere we can find it with a name Jacob expects
|
||||
File temporaryDll = File.createTempFile(LibraryLoader
|
||||
.getPreferredDLLName(), ".dll");
|
||||
FileOutputStream outputStream = new FileOutputStream(temporaryDll);
|
||||
byte[] array = new byte[8192];
|
||||
for (int i = inputStream.read(array); i != -1; i = inputStream
|
||||
.read(array)) {
|
||||
outputStream.write(array, 0, i);
|
||||
}
|
||||
outputStream.close();
|
||||
temporaryDll.deleteOnExit();
|
||||
// Ask LibraryLoader to load the dll for us based on the path we
|
||||
// set
|
||||
System.setProperty(LibraryLoader.JACOB_DLL_PATH, temporaryDll
|
||||
.getPath());
|
||||
LibraryLoader.loadJacobLibrary();
|
||||
return true;
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user