ablog

不器用で落着きのない技術者のメモ

Linux で jsvc をコンパイルすると java.c:22:17: error: jni.h: No such file or directory

http://www.jajakarta.org/tomcat/tomcat5.0/mix/docs/tomcat-docs/setup.html
を参考にして Linux で jsvc をコンパイルしたら、

# cd /usr/local/tomcat/bin
# cp -a jsvc.tar.gz /tmp
# cd /tmp
# tar xvzf jsvc.tar.gz
# cd jsvc-src
# chmod +x configure
# ./configure --with-java=/usr/java
# make
make -C native all
make[1]: Entering directory `/tmp/jsvc-src/native'
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -I/usr/java/include -I/usr/java/include/linux -Wall -Wstrict-prototypes -c java.c -o java.o
java.c:22:17: error: jni.h: No such file or directory
java.c:35: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
java.c:36: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
java.c:37: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘cls’

...

make[1]: *** [java.o] Error 1
make[1]: Leaving directory `/tmp/jsvc-src/native'
make: *** [native/all] Error 2

って怒られた。
本当に jni.h がないのか調べてみると、

# find / -name jni.h
/u01/app/oracle/product/10.2.0/db_1/jdk/include/jni.h
/usr/java/jdk1.6.0_18/include/jni.h

あった。
ところで、--with-java ってなんだ?

スクリプトを実行する前に、JAVA_HOME環境変数JDKインストールパスを設定する必要があります。 またはその代わりに、./configureスクリプトを実行する際に、 ./configure --with-java=/usr/javaというように --with-javaパラメータを使ってJDKのパスを指定します。

http://www.jajakarta.org/tomcat/tomcat5.0/mix/docs/tomcat-docs/setup.html

つまり、JAVA_HOME を指定するってことか。今回の環境だと /usr/java/default だから、

# ./configure --with-java=/usr/java/default
# make
make -C native all
make[1]: Entering directory `/tmp/jsvc-src/native'
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c java.c -o java.o
java.c:49: warning: function declaration isn’t a prototype
java.c: In function ‘java_init’:
java.c:122: warning: implicit declaration of function ‘dso_error’
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c location.c -o location.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c replace.c -o replace.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c signals.c -o signals.o
ar cr libservice.a arguments.o debug.o dso-dlfcn.o dso-dyld.o help.o home.o java.o location.o replace.o signals.o
ranlib libservice.a
gcc -ldl -lpthread jsvc-unix.o libservice.a -o ../jsvc
make[1]: Leaving directory `/tmp/jsvc-src/native'

おk!