저는 현재 JNI 환경과 jobject 객체를 로컬로 저장했습니다. JNI에서 ICS 및 장치를 실행하려면 JNI 코드를 수정해야합니다. 심지어 바로 그 일을하고있는 경우JNIEnv 글로벌 참조가 C의 jobject와 다른 점은 무엇입니까?
02-20 10:20:59.523: E/dalvikvm(21629): JNI ERROR (app bug): attempt to use stale local reference 0x38100019
02-20 10:20:59.523: E/dalvikvm(21629): VM aborting
02-20 10:20:59.523: A/libc(21629): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 21629
내가/만들 전역을 파괴하는 방법에 대한 혼란 스러워요, 그리고이 오류가 내가 얻을 수있다.
내 응용 프로그램이 현재이 코드를 사용하여 모든 사전 ICS 장치에서 잘 실행: 마지막으로
void WrapSetBaud(WORD w) {
return (*myEnv)->CallStaticVoidMethod(myEnv, myObject, changeID, w);
}
short WrapGetIt(WORD time) {
return (*myEnv)->CallStaticShortMethod(myEnv, myObject, getID, time);
}
void WrapPutIt(BYTE buff) {
return (*myEnv)->CallStaticVoidMethod(myEnv, myObject, putID, buff);
}
void WrapFlushIt(void) {
return (*myEnv)->CallStaticVoidMethod(myEnv, myObject, flushID);
}
void WrapDelayIt(WORD wait) {
return (*myEnv)->CallStaticVoidMethod(myEnv, myObject, delayID, wait);
}
다음 GetStaticMethodID
통화에서
BYTE Java_my_eti_commander_RelayAPIModel_00024NativeCalls_InitRelayJava(JNIEnv *env, jobject obj ) {
myEnv = (env);
myObject = obj;
changeID = (*myEnv)->GetStaticMethodID(myEnv, myObject, "changeItJavaWrapper", "(S)V" );
getID = (*myEnv)->GetStaticMethodID(myEnv, myObject, "getItJavaWrapper" , "(S)S" );
putID = (*myEnv)->GetStaticMethodID(myEnv, myObject, "putItJavaWrapper" , "(B)V");
flushID = (*myEnv)->GetStaticMethodID(myEnv, myObject, "flushItJavaWrapper" , "()V" );
delayID = (*myEnv)->GetStaticMethodID(myEnv, myObject, "delayItJavaWrapper" , "(S)V" );
RelayAPI_SetBaud= WrapSetBaud;
RelayAPI_get = WrapGetIt;
RelayAPI_put = WrapPutIt;
RelayAPI_flush = WrapFlushIt;
RelayAPI_delay = WrapDelayIt;
...
}
을의 RelayAPI_ 변수는 여기에 이어질 모든 함수 포인터는 , 여기 내 Java 코드로 돌아갑니다.
public static void changeItJavaWrapper(short l) throws IOException {
mModelService.changeitJava(l);
}
public static void flushItJavaWrapper() {
mModelService.flushitJava();
}
public static void putItJavaWrapper(byte p) {
mModelService.putitJava(p);
}
public static void delayItJavaWrapper(short wait) {
mModelService.delayitJava(wait);
}
public static short getItJavaWrapper(short s) throws IOException {
return mModelService.getitJava(s);
}
내 초기화를 변경 :
myEnv = (*env)->NewGlobalRef(env,obj);
myObject = (*env)->NewGlobalRef(env,obj);
그러나이 같은 매개 변수를 가지고 내가이 극도로 혼란 스러워요, 그것은 단지 이해가되지 않습니다. this tutorial
, this page
및 the oracle docs
은 그 방법과 관련하여 아무런 정보가 없으므로이 방법에 대한 설명서를 찾을 수 없습니다. 모든
편집
jmethodID changeID;
jmethodID getID;
jmethodID putID;
jmethodID flushID;
jmethodID delayID;
jobject myObject;
jclass bluetoothClass;
JNIEnv *myEnv;
덕분에 이것에 대한 많은 촉구에 대해 당신은 문서를 찾을 수 있습니다. C에서 더 많은 정보를 가지고있는 좋은 웹 사이트를 아십니까? – JuiCe
정확히 무엇에 대한 정보를 찾고 있습니까? JNI? 모범 사례? – junix
'GetFieldID' 대신에'GetStaticMethodID'를 사용하고 있기 때문에 아직 조금 분실했습니다. 나중에 코드에서 찾을 수있는 메서드를 호출하려면 두 번째 코드 블록에 표시된 JNI Env를 전역으로 저장해야합니다. - 또한 tUsb_Device 변수가 무엇인지 알지 못합니다. 해당 매개 변수의 숫자는 무엇과 비교됩니까? – JuiCe