Cygwin で Java
更新されてません。高橋さんのCygwinでJavaを快適に使うの方が情報が新しく、更新されているのでお勧めです。
はじめに
Cygwin内部から(Windows版の)Javaを使おうってことです。
このときに困ることは、
- パス、クラスパス
- (JNIを使うとき)インクルードファイル
くらいなもんです。
準備
Windows版のJDKをSunからダウンロードして、インストールします。
インストール先は、
c:\cygwin\usr\local\jdk1.3.1
とでもしておきましょう。
で、パス・クラスパスの変換をしてくれるラッパーを用意します。
/usr/local/bin/java_wrapper:
#!/bin/bash
WIN32JDKDIR=/usr/local/j2sdk1.4.0
PROGRAM=$WIN32JDKDIR/bin/`basename $0`
if [ ! -e $PROGRAM ] ; then
echo "$PROGRAM not found."
exit 1;
fi
if [ -n $CLASSPATH ] ; then
CLASSPATH=`cygpath -p -w "$CLASSPATH"`
fi
ARGS=""
while case $# in
0) false;; # no more argument
*) true;;
esac
do
arg="$1"; shift
case $arg in
-classpath)
ARGS="$ARGS -classpath"
if [ ! "$1" = "" ] ; then
ARGS="$ARGS `cygpath -p -w $1`"
shift
fi
;;
*)
ARGS="$ARGS $arg"
;;
esac
done
# echo CLASSPATH=$CLASSPATH $PROGRAM $ARGS
exec $PROGRAM $ARGS
このラッパーを使うようにjava、javacなどを準備します。
このラッパーはクラスパス(環境変数・引数両方)をWindowsのパスに変換して、
コマンドを実行してくれます。
cd /usr/local/bin
ln -s java_wrapper java
ln -s java_wrapper javac
ln -s java_wrapper javah
ln -s java_wrapper jar
...
つまり、
for i in HtmlConverter appletviewer extcheck idlj jar jarsigner java \
javac javadoc javah javap javaw jdb keytool kinit klist ktab \
native2ascii orbd policytool rmic rmid rmiregistry serialver \
servertool tnameserv ; do
ln -s java_wrapper $i ;
done
JNIを使う
(jdk_root)/include/win32/jni_md.h:
typedef long jint;
+ #ifdef __GNUC__
+ typedef long long jlong;
+ #else
typedef __int64 jlong;
+ #endif
typedef signed char jbyte;
Hello.java:
import java.lang.*;
import java.io.*;
public class Hello{
static{
System.loadLibrary("libHello");
}
public Hello(){
}
public native void greeting();
public static void main(String args[]){
Hello h = new Hello();
h.greeting();
}
Hello.c:
#include
#include "Hello.h"
JNIEXPORT void JNICALL Java_Hello_greeting
(JNIEnv *env, jobject obj){
printf("Hello!\n");
}
$ javac Hello.java
$ javah Hello
$ gcc -shared Hello.c -I/usr/local/jdk1.3/include
-I/usr/local/jdk1.3/include/win32
-Wl,--enable-auto-import -Wl,--add-stdcall-alias
-o Hello.dll
Link
さいごに
相変わらず手抜きな説明でごめんなさい。