Mixing BC and CNI in the same executable

Stephen Kell srk31@srcf.ucam.org
Sat Jan 23 00:39:00 GMT 2010


I was hoping I could use BC to avoid compiling and linking a huge jar.so 
into my CNI C++ program (which only requires a few functions from the 
jar). Instead I want libgcj to load code from the jar at run time. My 
C++ code doesn't use anything in the jar directly.

Should this be possible?  I initially thought not, but it's not clear 
why. (Presumably libgcj uses one ABI or other itself, or exports both; 
either of these implies that the two can be mixed somehow....)

Anyway, having tried it, I'm having the following problem. I compiled 
the Java code which my CNI calls target (it happens to be the antlr 
runtime, and is packaged as another jar) with -findirect-dispatch. That 
works, but now my CNI code can't like with it, for reasons that aren't 
clear. Does an -findirect-dispatch binary still expose the right symbols 
for the "direct dispatch" ABI symbols?

Here's the failure I'm seeing (huge command, sorry).

gcj -fno-eliminate-unused-debug-symbols -fno-eliminate-unused-debug-type
s -fPIC -g3 --classpath=./java:/home/stephen/opt/lib/java/antlr-runtime-
3.1.3.jar:/usr/share/java/junit-3.8.2.jar:/home/stephen/opt/lib/java/str
ingtemplate-3.2.jar: -Wall  -L../../dwarf/libdwarfpp -L/home/stephen/opt
/lib -L../../c++-fileno/lib -L../../libsrk31c++ -o "cake" java/cake/Clon
eableTree.o java/cake/InternalError.o java/cake/SemanticError.o java/cak
e/TreewalkError.o alias.o cake.o cppcatch.o derive.o dwarf.o exists.o ja
vacatch.o link.o main.o module.o pred.o supplementary.o util.o ../../dwa
rf/libdwarfpp/libdwarfpp.a -lsrk31c++ -Wl,--whole-archive -ldwarf -Wl,--
no-whole-archive -ldwarfpp -lfileno -lelf -lstdc++ antlr-runtime.jar.so

java/cake/CloneableTree.o: In function `cake::CloneableTree::CloneableTr
ee(org::antlr::runtime::tree::Tree*)': /home/stephen/work/devel/cake/src
/cake/CloneableTree.java:11: undefined reference to `org::antlr::runtime
::tree::CommonTree::class$'
(snipped lots more)

The funny thing is that actually, the symbols do seem to be exported... 
maybe some linker magic is stopping them from being resolved?

$ objdump -t antlr-runtime.jar.so | c++filt | grep CommonTree::class
00083c00 l     O .rodata        00000090              org::antlr::runtime::tree::CommonTree::class$
000a4870 l     O .bss   00000004              .hidden org::antlr::runtime::tree::CommonTree::class$$

I'm guessing the answer is "it won't work" but thought I'd ask anyway. I 
can provide a tarball on request. Thanks for reading,

Stephen.



More information about the Java mailing list