我将一个JVM嵌入到我的die服务器中,它有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
发布于 2012-05-01 20:50:29
看起来我已经将JNIEnv*放到了全局作用域中。虽然这本身不应该造成问题,因为它在使用它的每个线程中都会被覆盖,但JNI似乎希望/需要在每次使用它时在内部释放它。API设计的奇观!
https://stackoverflow.com/questions/10397457
复制相似问题