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