Cannot link Java native libs on Win32 with MinGW [patch]

Jean-Philippe Leboeuf <[email protected]> Wed, 12 Jul 2006 15:45:24 +0200
Newsgroups gmane.comp.mozilla.jrex
Message-ID <[email protected]>
Hello,

still going on with all my problems with MinGW...

Now the biggest one with no complete solution, cos JRex does not start 
XPCOM.

In the native Makefile.in we have :

ifeq ($(OS_ARCH),WINNT)
EXTRA_DSO_LDOPTS+= \
        $(JAVA_HOME)/lib/$(LIB_PREFIX)jawt.$(LIB_SUFFIX) \
        $(JAVA_HOME)/lib/$(LIB_PREFIX)jvm.$(LIB_SUFFIX) \
        $(NULL)

But on Win32 Java native libs does not have a "lib" prefix, as have C++ 
libs...
For this problem I propose to write (and it is the attached patch) :

ifeq ($(OS_ARCH),WINNT)
EXTRA_DSO_LDOPTS+= \
        $(JAVA_HOME)/lib/jawt.$(LIB_SUFFIX) \
        $(JAVA_HOME)/lib/jvm.$(LIB_SUFFIX) \
        $(NULL)

Now the strange consequence : the linker is going on with the jawt lib 
but it cannot link the jvm lib (this two libs are in the same 
directory.?.?.).
I found another strange behaviour with libs on Win32 here 
[http://www.mozdev.org/pipermail/jrex/2005-February/001476.html], but 
this solution does not seem to work for me.

My problem is identified on the Sun Developper Network there 
[http://forum.java.sun.com/thread.jspa?threadID=596522&messageID=3925672], 
but the solution is for MS Visual Studio.
Same problem there 
[http://www.velocityreviews.com/forums/t150203-error-invoking-jvm-through-jni.html] 
with a proposal for a solution as detailed there 
[http://www.inonit.com/cygwin/jni/invocationApi/archive.html] :
1) create a jvm.def file :

EXPORTS
JNI_CreateJavaVM@12
JNI_GetDefaultJavaVMInitArgs@4
JNI_GetCreatedJavaVMs@12

2) generate the import library :

dlltool --input-def jvm.def --kill-at --dllname jvm.dll --output-lib libjvm.dll.a


This solution seems to be very common for dealing with the cooperation 
between MinGW and Native Java 
[http://java.freehep.org/jcvslet/JCVSlet/show/freehep/freehep/lib/WIN32-g++/README.txt/1.3]. 


But it does not answer why I need this trick for the jvm lib and not for 
the jawt one...

So in the Makefile.in I put :

ifeq ($(OS_ARCH),WINNT)
EXTRA_DSO_LDOPTS+= \
        $(JAVA_HOME)/lib/jawt.$(LIB_SUFFIX) \
        -L..\..\..\..\..\JRex_patches\jvm -ljvm \
        $(NULL)

(JRex_patches\jvm is the directory where the linker can find the new 
generated import library).

With all these patches applied (see previous postings) I can build JRex 
without DOM but when I try to test the example I get :

_*jrex.log :

*_***************** JRexL inited *****************
***************** Starting of JREX-Logging Wed Jul 12 14:06:07 CEST 2006 
*****************
org.mozilla.jrex.JRexFactory --->static()--> **** loading implementers ****
org.mozilla.jrex.JRexFactory --->loadImplementers()--> **** impl 
TABLE<{JRexStatusBar=org.mozilla.jrex.ui.JRexStatusBarImpl, 
JRexPopupMenu=org.mozilla.jrex.ui.JRexPopupMenuImpl, 
ObserverEventHandler=org.mozilla.jrex.event.observer.ObserverEventHandler, 
WindowManager=org.mozilla.jrex.window.JRexWindowManagerImpl, 
TooltipEventHandler=org.mozilla.jrex.event.tooltip.TooltipEventHandler, 
HistoryEventHandler=org.mozilla.jrex.event.history.HistoryEventHandler, 
JRexPrintPreviewToolBar=org.mozilla.jrex.ui.JRexPrintPreviewToolBarImpl, 
URIContentEventHandler=org.mozilla.jrex.event.uricontent.URIContentEventHandler, 
ProgressEventHandler=org.mozilla.jrex.event.progress.ProgressEventHandler, 
WindowEventHandler=org.mozilla.jrex.event.window.WindowEventHandler, 
JRexMenuBar=org.mozilla.jrex.ui.JRexMenuBarImpl, 
JRexToolBar=org.mozilla.jrex.ui.JRexToolBarImpl, 
ContextMenuEventHandler=org.mozilla.jrex.event.context.ContextMenuEventHandler}>***
org.mozilla.jrex.JRexFactory --->**** startEngine()-->engineStarted <false>
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->startXPCOM()--> **** USING 
GRE_PATH <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre> ***
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library list... ****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<#The list of GRE libraries to load>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<nspr4>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\nspr4.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\nspr4.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<plc4>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\plc4.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\plc4.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<plds4>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\plds4.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\plds4.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<xpcom>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\xpcom.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\xpcom.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<xpcom_compat>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library 
<P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\xpcom_compat.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library 
<P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\xpcom_compat.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<mozz>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\mozz.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\mozz.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<mozjs>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
<P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\mozjs.dll> does not 
exsist!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<gkgfx>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\gkgfx.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\gkgfx.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<js3250>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\js3250.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\js3250.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<jsj3250>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\jsj3250.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\jsj3250.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<jsj>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
<P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\jsj.dll> does not 
exsist!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<mozctl>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
<P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\mozctl.dll> does not 
exsist!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<mozctlx>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
<P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\mozctlx.dll> does not 
exsist!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<softokn3>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\softokn3.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\softokn3.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<nss3>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\nss3.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\nss3.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<nssckbi>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\nssckbi.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\nssckbi.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<ssl3>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\ssl3.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\ssl3.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<smime3>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\smime3.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\smime3.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<msgbsutl>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
<P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\msgbsutl.dll> does not 
exsist!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Library 
to load<jrex>****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\jrex.dll>...****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->loadLibraries()--> **** Loading 
library <P:\MyDevelopments\MozDev\mozilla\dist\jrex_gre\jrex.dll> 
done!!!****
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->startXPCOM()--> **** USING 
forceNoProfile <false> ***
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->startXPCOM()--> **** USING 
profileName <.JRex> ***
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->startXPCOM()--> **** USING 
profilePath <C:\Documents and Settings\Jean-Philippe> ***
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->notifyXPCOMInited()--> **** 
xpcomInitRV<-1>***
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->startXPCOM()--> **** XPCOM INIT 
FAILED <InitXPCOM>
org.mozilla.jrex.xpcom.JRexXPCOMImpl --->startXPCOM()--> **** 
xpcomInitRV <-1>

_*jrex.err :

*_org.mozilla.jrex.exception.JRexException
    at 
org.mozilla.jrex.xpcom.JRexXPCOMImpl.startXPCOM(JRexXPCOMImpl.java:143)
    at org.mozilla.jrex.JRexFactory.startEngine(JRexFactory.java:222)
    at test.JRexExample.main(JRexExample.java:50)
Caused by: java.lang.UnsatisfiedLinkError: InitXPCOM
    at org.mozilla.jrex.xpcom.JRexXPCOMImpl.InitXPCOM(Native Method)
    at 
org.mozilla.jrex.xpcom.JRexXPCOMImpl.access$200(JRexXPCOMImpl.java:45)
    at org.mozilla.jrex.xpcom.JRexXPCOMImpl$1.run(JRexXPCOMImpl.java:173)
Exception in thread "main"

I think I am close to start the example...
However I might need some help ;-)

++jpl

_______________________________________________
JRex mailing list
[email protected]
http://mozdev.org/mailman/listinfo/jrex
Makefile_native_JavaWin32.patch (text/plain, 286 B)
15a16
>  #   J.-P. Leboeuf <[email protected]>
333,334c334,335
< 		$(JAVA_HOME)/lib/$(LIB_PREFIX)jawt.$(LIB_SUFFIX) \
< 		$(JAVA_HOME)/lib/$(LIB_PREFIX)jvm.$(LIB_SUFFIX) \
---
> 		$(JAVA_HOME)/lib/jawt.$(LIB_SUFFIX) \
> 		$(JAVA_HOME)/lib/jvm.$(LIB_SUFFIX) \