input line is too long
Ranjit Mathew
rmathew@hotmail.com
Thu Jan 2 13:24:00 GMT 2003
Erik Poupaert wrote:
> When I make an objdump of the executable, it says:
>
> SYMBOL TABLE:
> [17212](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x000fe73f
> _Java_org_eclipse_swt_internal_win32_OS_GetVersionExW@12
>
> When I make an objdump of the jni-dll, it says:
>
> [Ordinal/Name Pointer] Table
> [ 316] _Java_org_eclipse_swt_internal_win32_OS_GetVersionExW@12
>
> The symbols are exactly the same and available in both cases.
Unlike MSVC, the MinGW GCC/binutils toolchain does not export
functions from an EXE, even if you explicitly add
"__declspec(dllexport)" (which is what JNICALL is defined as on
Win32) to the function definition.
The JNI implementation in GCJ ultimately calls the Win32
GetProcAddress( ) function on your EXE to locate the native function
and it fails due to the reason given above - it however
succeeds if the functions are in a DLL.
To make this work with MinGW, here are the steps for a simple
object file (say "foo.o") that exports a function that gets
linked statically into your EXE (say "snafu.exe"):
1. Create an exports definition file:
dlltool --output-def bar.def foo.o
2. Generate an export file from this:
dlltool --dllname snafu.exe --output-exp foobar.exp --def bar.def
3. Link in to create the final executable:
gcc -o snafu.exe foobar.exp foo.o wombat.o
I'm attaching a simple program that you can try out
with and without the above steps to understand the
difference:
--------------------------------- 8< ---------------------------------
#include <stdio.h>
#include <windows.h>
typedef void (*MyFuncPtr)( int);
__declspec(dllexport) void MyCoolFn( int a)
{
printf( "MyCoolFn: %d\n", a);
}
int main( void)
{
char strbuf[1024];
HMODULE hM;
GetModuleFileName( NULL, strbuf, sizeof(strbuf));
hM = LoadLibrary( strbuf);
if( hM == NULL) {
printf( "LoadLibrary( ) failed!\n");
}
else
{
MyFuncPtr f = (MyFuncPtr )( GetProcAddress( hM, "MyCoolFn"));
if( f == NULL)
{
printf( "GetProcAddress( ) failed!\n");
}
else
{
(*f)( 333);
}
}
return 0;
}
--------------------------------- 8< ---------------------------------
Hope this helps.
Sincerely Yours,
Ranjit.
--
Ranjit Mathew Email: rmathew AT hotmail DOT com
Bangalore, INDIA. Web: http://ranjitmathew.tripod.com/
More information about the Java
mailing list