free as in air

2007|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|09|11|12|
2012|03|04|05|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|03|04|06|09|
トップ «前の日記(2008-03-16) 最新 次の日記(2008-03-19)» /編集

2008-03-17 [長年日記]

§ [ruby] ext

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