JNIEnv 환경에 대한 글로벌 참조 유지
나는 저장하고 있습니다.JNIEnv
나중에 정적 Java 메서드를 호출할 수 있도록 글로벌에서.하지만 글로벌 포인터를 저장할 필요가 있습니까?JNIEnv
다른 자바 객체와 같은 방식으로, 또는 이것을 필요로 하지 않는 특별한 경우입니다.
JNIEnv* globalEnvPointer;
[JNICALL etc] void init(JNIENv* env, [etc])
{
//required?
globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env);
//or is this OK?
globalEnvPointer = env;
}
편집
나는 여기서 약간 멍청하다, 사용할 모든 방법들.globalEnvPointer
내가 내 안에서 발동되는 이유는init
사실은 나의c
프로그램의main
프로그램이 끝날 때까지 반환되지 않는 메서드입니다.저는 또한 C 프로그램에서 다른 스레드를 사용하지 않습니다.저는 이것이 답을 단순화한다고 생각합니다.
JNIEnv* globalEnvPointer;
[JNICALL etc] void main(JNIENv* env, [etc])
{
//required?
globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env);
//or is this OK?
globalEnvPointer = env;
someMethod();
}
void someMethod()
{
//use globalEnvPointer here
}
캐시할 수 없습니다.JNIEnv
포인터자세한 내용은 여기를 참조하십시오.
JNI 인터페이스 포인터(JNInv)는 현재 스레드에서만 유효합니다.다른 스레드가 Java VM에 액세스해야 하는 경우 먼저 AttachCurrent를 호출해야 합니다.스레드()를 사용하여 VM에 연결하고 JNI 인터페이스 포인터를 가져옵니다.VM에 연결되면 네이티브 스레드는 네이티브 메서드 내에서 실행되는 일반 Java 스레드처럼 작동합니다.기본 스레드는 현재 분리를 호출할 때까지 VM에 연결된 상태로 유지됩니다.나사산()을 사용하여 자체적으로 분리합니다.
당신이 할 수 있는 것은 캐시하는 것입니다.JavaVM
포인터를 대신합니다.
static JavaVM *jvm;
[JNICALL etc] void init(JNIENv* env, [etc])
{
jint rs = (*env)->GetJavaVM(env, &jvm);
assert (rs == JNI_OK);
}
그리고 필요할 때마다JNIEnv
지정되지 않은 컨텍스트에서 포인터를 사용하여 다음 작업을 수행합니다.
void someCallback() {
JNIEnv *env;
jint rs = (*jvm)->AttachCurrentThread(jvm, &env, NULL);
assert (rs == JNI_OK);
// Use the env pointer...
}
그러나 Java에서 네이티브 메소드를 호출할 때마다 사용할 env 포인터가 제공됩니다.
JNIEXPORT jint JNICALL Java_package_Class_method(JNIEnv *env, jobject obj) {
// just use the env pointer as is.
}
언급URL : https://stackoverflow.com/questions/12420463/keeping-a-global-reference-to-the-jnienv-environment
'programing' 카테고리의 다른 글
숫자를 가장 가까운 10으로 반올림하는 방법은? (0) | 2023.08.20 |
---|---|
'Match' cmdlet을 사용하여 PowerShell에서 문자열 배열(또는 목록)을 필터링하려면 어떻게 해야 합니까? (0) | 2023.08.20 |
배열의 모든 값이 동일한지 확인합니다. (0) | 2023.08.20 |
콘텐츠 보안 정책:페이지 설정이 리소스 로드를 차단했습니다. (0) | 2023.08.20 |
텍스트 파일로 변수 출력("echo") (0) | 2023.08.20 |