[Scons-users] JavaH builder doesn't get output file names right for inner classes
    Abigail Bunyan 
    abigail.bunyan at microsoft.com
       
    Mon Feb 20 06:23:38 EST 2017
    
    
  
Given a Java source file like:
    class Outer {
        class Inner {
            public native void f();
        }
    }
javac will create Outer.class and Outer$Inner.class, but javah will create
Outer.h and Outer_Inner.h. However, the SCons JavaH builder expects it to
create Outer$Inner.h, leading to unnecessary rerunning of javah:
    $ echo "JavaH('jni', 'Outer.java')" > SConstruct
    $ scons -Q --debug=explain
    scons: building `Outer/Outer$Inner.class' because it doesn't exist
    javac -d Outer -sourcepath . Outer.java
    scons: building `jni/Outer$Inner.h' because it doesn't exist
    javah -d jni -classpath Outer Outer Outer
    $ ls jni
    Outer.h Outer_Inner.h
    $ scons -Q --debug=explain
    scons: building `jni/Outer$Inner.h' because it doesn't exist
    javah -d jni -classpath Outer Outer Outer
This issue can also cause builds to fail due to the missing dependency:
    $ echo '#include "jni/Outer_Inner.h"' > Outer_Inner.c
    $ echo 'Library("outer", ["outer.c"])' >> SConstruct
    $ rm -rf jni/ Outer/ && scons -Q
    javac -d Outer -sourcepath . Outer.java
    gcc -o outer.o -c outer.c
    outer.c:1:29: fatal error: jni/Outer_Inner.h: No such file or directory
     #include "jni/Outer_Inner.h"
                                 ^
    compilation terminated.
    scons: *** [Outer_Inner.o] Error 1
This is occurring under SCons v2.5.1.
    
    
More information about the Scons-users
mailing list