このチュートリアルのように、JNI サンプルを 1 つの C ファイルで OSX 上で動作させることができました。しかし、他の C ファイルにリンクするメイクファイルを作成しようとすると、恐ろしい「UnsatisfiedLinkError」が発生します。
これがgithubのmakefileです。
「make java」と入力した結果は次のとおりです。
gcc -c -Wall -Os -std=gnu99 -I -fnested-functions -fms-extensions -DDEBUG vm.c -o vm.o
gcc -c -Wall -Os -std=gnu99 -I -fnested-functions -fms -extensions -DDEBUG struct.c -o struct.o
gcc -c -Wall -Os -std=gnu99 -I -fnested-functions -fms-extensions -DDEBUG serial.c -o serial.o
gcc -c -Wall -Os -std=gnu99 -I -fnested-functions -fms-extensions -DDEBUG compile.c -o compile.o
gcc -c -Wall -Os -std=gnu99 -I -fnested-functions -fms-extensions -DDEBUG util.c -o util.o
gcc -c -Wall -Os -std=gnu99 -I -fnested-functions -fms-extensions -DDEBUG sys.c -o sys.o
gcc -c -Wall -Os -std=gnu99 -I - fnested-functions -fms-extensions -DDEBUG variable.c -o variable.o
gcc -c -Wall -Os -std=gnu99 -I -fnested-functions -fms-extensions -DDEBUG interpret.c -o interpret.o
gcc -c -Wall -Os -std=gnu99 -I -fnested-functions -fms -extensions -DDEBUG hal_stub.c -o hal_stub.o
gcc -c -Wall -Os -std=gnu99 -I -fnested-functions -fms-extensions -DDEBUG node.c -o node.o
gcc -c -Wall -Os -std=gnu99 -I -fnested-functions -fms-extensions -DDEBUG file.c -o file.o
javac javagree.java
javah -jni javagree
cc -c -fPIC -I/System/Library/Frameworks/JavaVM.framework/ヘッダー javagree.c -o libjavagree.o
libtool -dynamic -lSystem vm.o struct.o serial.o compile.o util.o sys.o variable.o interpret.o
hal_stub.o node.o file.o libjavagree.o -o libjavagree.dylib -macosx_version_min 10.8
$ java javagree
Exception in thread "main" java.lang.UnsatisfiedLinkError: javagree.filagree(Ljava/lang/Object;[Ljava/lang/Object;)J
at javagree.filagree(Native Method)
at javagree.main(javagree.java ) :46)
問題は、より多くのファイルをリンクすると、関数が見つからないのはなぜですか? 正しくリンクしていませんか?