NPE in parser->getDOMImplementation() with CNI
Andrew Haley
aph@redhat.com
Mon Jun 22 11:51:00 GMT 2009
Sam Ruby wrote:
> Andrew Haley wrote:
>> Mark Wielaard wrote:
>>> On Sun, 2009-06-21 at 16:46 +0100, Andrew Haley wrote:
>>>> Sam Ruby wrote:
>>>>> I'm trying to develop a JAXP implementation using CNI, but I get a
>>>>> NullPointerException when I try to get a DOMImplementation. I've
>>>>> attached a small script (tested on Ubuntu 9.04) which demonstrates the
>>>>> problem.
>>>>>
>>>>> Any help would be appreciated.
>>>> Congratulations on this excellent test case. Next time I want to tell
>>>> people how to do it right, I'll point them at your posting.
>>>>
>>>> However, I get
>>>>
>>>> $ sh ~/testdomimpl.sh
>>>> gnu.xml.dom.DomDocumentBuilderFactory@160ecdad
>>>> gnu.xml.dom.DomDocumentBuilder@15ffbc45
>>>> gnu.xml.dom.DomImpl@15ef0ee5
>>>>
>>>> gnu.xml.dom.DomDocumentBuilderFactory@2df0bea7
>>>> gnu.xml.dom.DomDocumentBuilder@2de03d5f
>>>> gnu.xml.dom.DomImpl@2dd0bfdf
>>>> $ gcj --version
>>>> gcj (GCC) 4.4.0 20090307 (Red Hat 4.4.0-0.23)
>>> I get the same with that version of gcj.
>>> But on an older gcj installation:
>>> gcj (Debian 4.3.2-2) 4.3.2
>>>
>>> gnu.xml.dom.DomDocumentBuilderFactory@6992f029
>>> gnu.xml.dom.DomDocumentBuilder@647a3539
>>> gnu.xml.dom.DomImpl@64826fa9
>>>
>>> gnu.xml.dom.DomDocumentBuilderFactory@17d5dffb
>>> gnu.xml.dom.DomDocumentBuilder@12bcf52b
>>> java.lang.NullPointerException
>>> at java.io.PrintStream.println(PrintStream.java:473)
>>
>> I found the problem.
>>
>> There is an implementation of jaxp in /usr/share/java/jaxp-1.3.jar and
>> another in /usr/lib/libgcj.so.90. They are not the same version, and
>> they are not compatible.
>>
>> If you link against /usr/lib/libgcj.so.90 then you must compile against
>> the version of jaxp in that library.
>>
>> Do this:
>>
>> gcjh -cp /usr/share/java/libgcj.jar -d headers \
>> org.w3c.dom.DOMImplementation \
>> javax.xml.parsers.DocumentBuilder \
>> javax.xml.parsers.DocumentBuilderFactory
>
> I still see the problem. Even after I apt-get remove libjaxp1.3-java-gcj.
The problem is not libjaxp1.3-java-gcj, it's libjaxp1.3-java
>> I don't think it's possible to override the version of jaxp that's in
>> /usr/lib/libgcj.so.90.
>
> I'd be fine using that version... if only it would work.
The key is javax/xml/parsers/DocumentBuilder.h. Here's the difference
between the bad and the good versiona:
aph@classpath:/tmp$ diff -u headers/javax/xml/parsers/DocumentBuilder.h bad/javax/xml/parsers/DocumentBuilder.h
--- headers/javax/xml/parsers/DocumentBuilder.h 2009-06-22 11:47:28.000000000 +0000
+++ bad/javax/xml/parsers/DocumentBuilder.h 2009-06-22 11:46:37.000000000 +0000
@@ -51,6 +51,7 @@
public: // actually protected
DocumentBuilder();
public:
+ virtual void reset();
virtual ::org::w3c::dom::Document * parse(::java::io::InputStream *);
virtual ::org::w3c::dom::Document * parse(::java::io::InputStream *, ::java::lang::String *);
virtual ::org::w3c::dom::Document * parse(::java::lang::String *);
@@ -62,9 +63,11 @@
virtual void setErrorHandler(::org::xml::sax::ErrorHandler *) = 0;
virtual ::org::w3c::dom::Document * newDocument() = 0;
virtual ::org::w3c::dom::DOMImplementation * getDOMImplementation() = 0;
- virtual void reset();
virtual ::javax::xml::validation::Schema * getSchema();
virtual jboolean isXIncludeAware();
+private:
+ static const jboolean DEBUG = 0;
+public:
static ::java::lang::Class class$;
};
************************************************************************
Please make sure you delete *everything* from the old build. Especially
the contents of the headers directory.
************************************************************************
If all that still fails, please send the failing script so we can try it.
Andrew.
More information about the Java
mailing list