Rubyは拡張ライブラリをかなり書きやすいとは言え(もう全部VALUEとか、 Cの型と相互に変換する方法が充実してるとか、GCのとことか)、しかし、やはりデバッグが辛い。segvすればまだわかりやすいのだが、StringValueCStrで「ヌル文字が含まれています」とか言われるとかなり辛い。←イマココ!
なんかgdb --argsで起動してbreak rb_raiseしてrunしてbtすりゃいいらし。
しかしJNIでDestroyしちゃいけない気がする。Linuxだけか?取り急ぎとはいえ拙すぎるコードだが、どうにも初回しかVMの作成に成功しない。
#include <jni.h> int main(char* argv) { JavaVM *jvm1, *jvm2, *jvm3, *jvm4, *jvm5; JNIEnv *env1, *env2, *env3, *env4, *env5; JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */ JavaVMOption options[1]; jint res; options[0].optionString = "-Djava.class.path="; vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = 0; printf("%d", (res = JNI_CreateJavaVM(&jvm1, (void**)&env1, &vm_args))); if (res == JNI_OK) jvm1[0]->DestroyJavaVM(jvm1); printf("%d", (res = JNI_CreateJavaVM(&jvm2, (void**)&env2, &vm_args))); if (res == JNI_OK) jvm2[0]->DestroyJavaVM(jvm2); printf("%d", (res = JNI_CreateJavaVM(&jvm3, (void**)&env3, &vm_args))); if (res == JNI_OK) jvm3[0]->DestroyJavaVM(jvm3); printf("%d", (res = JNI_CreateJavaVM(&jvm4, (void**)&env4, &vm_args))); if (res == JNI_OK) jvm4[0]->DestroyJavaVM(jvm4); printf("%d", (res = JNI_CreateJavaVM(&jvm5, (void**)&env5, &vm_args))); if (res == JNI_OK) jvm5[0]->DestroyJavaVM(jvm5); }
% gcc -I/usr/java/default/include -I/usr/java/default/include/linux -g jnitest.c /usr/java/default/jre/lib/i386/server/libjvm.so % LD_LIBRARY_PATH=/usr/java/default/jre/lib/i386/server/ gdb ./a.out
0-1-1-1-1