Jni 다 중 스 레 드 프로 그래 밍, 하위 스 레 드 리 셋 자바 방법

2646 단어 jni
c++ 층 은 서버 에서 tcp 데 이 터 를 주동 적 으로 전송 하기 때문에 c++ 층 에서 받 은 socket 데 이 터 를 층 층 이 자바 로 변환 하 는 수요 가 있 습 니 다.
다음은 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();//      
    }
}

좋은 웹페이지 즐겨찾기