나는 이것이 여기에서도 어려운 질문이라고 생각한다. 어쨌든 나는 시험해보고 싶다.JNI 내부에서 파이버를 호출해야하는 이유 JVM에서 StackOverflow를 던집니까?
Java 내부에 기본 부스트 파이버를 포팅하는 미니 프로젝트 JNI를 실현했습니다.
이
이 자바 테스트public class Test {
public static void main(String[] args) throws InterruptedException {
NativeFiber fiber=new NativeFiber(new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
});
fiber.start();
}
}
에게이다
inline void execute(JNIEnv * env,jobject runnable,jmethodID mid){
cout << " 31---" << endl;
env->CallVoidMethod(runnable, mid);
cout << " 32---" << endl;
}
/*
* Class: java_ext_concurrent_fiber_NativeFiber
* Method: run
* Signature: (Ljava/lang/Runnable;)J
*/
JNIEXPORT void JNICALL Java_ext_concurrent_fiber_NativeFiber_run
(JNIEnv * env, jclass clazz, jobject runnable){
cout << " 1---" << endl;
jclass cls = env->GetObjectClass(runnable);
cout << " 2---" << endl;
jmethodID mid = env->GetMethodID(cls, "run", "()V");
cout << " 3---" << endl;
env->CallVoidMethod(runnable, mid);
boost::fibers::fiber fiber(execute,env,runnable,mid);
cout << " 3---" << endl;
}
JNI 인터페이스이다 내가 fiber.join을 (제거하면이 코드
throws StackOverflowException
실행) 내가 추가하면 fiber.detach();
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f5a37017f1f, pid=16559, tid=0x00007f5a38522700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V [libjvm.so+0x6d7f1f] jni_CallVoidMethodV+0x3f
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /data/git/concurrent/hs_err_pid16559.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
예 실제로 주소를 사용하지 않기 때문에 문제가되지 않습니다. 어쨌든 거기에 다음과 같은 문제가 두 번째 시간에 섬유를 검색하는 방법. 어쩌면 이드 ...하지만 어떻게? –
첫 번째 하나, java havent 포인터/인라인 함수 –