我将一个 JVM 嵌入到我的网络服务器中,它有 4 个永不消亡的工作线程。以下代码在 4 个工作人员中的任何一个内的每个 http 请求上运行:
// normally I would do URL routing here first, but this is just a JNI test now
jclass cls;
jmethodID method;
jobjectArray args;
jclass stringClass;
jstring jstr;
(*jvm)->AttachCurrentThread (jvm, &env, NULL);
cls = (*env)->FindClass(env, "HelloWorldClass");
method = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
jstr = (*env)->NewStringUTF(env, "Hello world!");
stringClass = (*env)->FindClass(env, "java/lang/String");
args = (*env)->NewObjectArray(env, 1, stringClass, jstr);
(*env)->CallStaticVoidMethod(env, cls, method, args);
当我逐步使用调试器时,它可以工作。但是,当我使用 weighttp 基准对其施加一些负载时,它会FindClass()
在线或CallSTaticVoidMethod()
在线上随机出现段错误。可能是什么问题呢?我阅读了很多文档,我看不出我需要如何在这里锁定或释放任何东西。
这几乎是可能的最基本的 JNI 代码,来自官方文档:http: //java.sun.com/docs/books/jni/html/invoke.html