Jni 다 중 스 레 드 프로 그래 밍, 하위 스 레 드 리 셋 자바 방법
2646 단어 jni
다음은 c++ 코드 세그먼트: 1: c + 헤더 파일 에 해당 하 는 반전 함수 지침 을 정의 합 니 다.
typedef void (*SwitchStateChangeCallback)(char *pchar);//
SwitchStateChangeCallback switchStateChangeCallback;//
2: jni 에서 상응하는 반전 방법 실현
void SwitchCallbackToJni(char *pchar) {
LOGD("callback jni:%s",pchar);
jclass jclassobj = threadEnv->GetObjectClass(gs_object);
jmethodID method = threadEnv->GetMethodID(jclassobj,"swithDataCallback","(ZLjava/lang/String;)V");
if(method == NULL)
{
LOGD("can't find Method swithDataCallback(boolean,String)");
}
threadEnv->CallVoidMethod(gs_object,method,TRUE,CharTojstring(threadEnv,pchar));
}
3: jni 에서 함 수 를 호출 할 때 해당 반전 함 수 를 c++ 에 설정 합 니 다.
smartSwitch = new SmartHomeSwitch();
smartSwitch>setSwitchStateChangeCallback(SwitchCallbackToJni);
4: c + 코드 의 적당 한 위치 에서 미리 저 장 된 jni 방법 switch State Change Callback (pCharResponse) 을 되 돌려 줍 니 다./jni 층 으로 되 돌리 기
문제 에 주의 하 다
c++ 주동 적 인 리 셋 은 해당 하 는 jni env 와 jovect 를 휴대 할 수 없 기 때문에 주로 결합 하지 않 기 위해 c++ 클래스 에서 jni 와 관련 된 헤더 파일 을 도입 하지 않 으 려 고 하기 때문에 해당 데 이 터 를 jni 층 으로 리 셋 하고 jni 에 게 자 유 롭 게 처리 해 야 하기 때문에 jniEnv 와 해당 하 는 jclass 를 미리 저장 해 야 합 니 다.(다 중 스 레 드 가 존재 하고 하위 스 레 드 에서 리 셋 을 호출 하면 주 스 레 드 의 jni env 를 사용 할 수 없습니다 (스 레 드 독립). 이 때 는 하위 스 레 드 의 jni env 지침 을 따로 가 져 오고 스 레 드 가 끝나 기 전에 풀 어야 합 니 다)
int retGvm=env->GetJavaVM(&gs_jvm);// jvm
gs_object=env->NewGlobalRef(jObj);// obj
스 레 드 내 jni env 포인터 가 져 오기 및 방출
void ThreadChangeJniCallback(bool isRun){
if(isRun){
gs_jvm->AttachCurrentThread(&threadEnv, NULL);//
}else{
gs_jvm->DetachCurrentThread();//
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
(원본) JNI 포인터 호출 순서를 알 수 없음JNI에서 바늘을 얻는 순서를 잘 모르겠어요. 다음은 전송된 바늘의 순서에 따라 코드가 뛰자마자 붕괴된다.다음과 같습니다. 이후 포인터를 받는 순서를 살짝 수정한 후 달려갈 수 있었다.다음과 같습니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.