Cygwin で Java




更新されてません。高橋さんのCygwinでJavaを快適に使うの方が情報が新しく、更新されているのでお勧めです。

はじめに

Cygwin内部から(Windows版の)Javaを使おうってことです。 このときに困ることは、 くらいなもんです。

準備

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

さいごに

相変わらず手抜きな説明でごめんなさい。