C 라이브러리에서 메소드를 가져 오는 Android 앱을 만들고 있습니다. C 라이브러리에서 사용되는 방법 중 하나는NDK 사용 중 포인터/참조
BYTE __stdcall GetVal(WORD what, long *val){
DWORD relaydate;
BYTE tmpb;
DWORD tmpd;
WORD tmp;
#ifdef HASTHAILANDSWAP
WORD what2;
#endif
if(val) *val=0;
if(!CheckInit()) return ERR_NOT_INIT;
if(what==VAL_NULL){
if(RelayAPI_DataValid){
return 0;
}else{
return -1;
}
}
if(!CheckValid()) return ERR_READ_FAIL;
switch(what){
case VAL_SWVERSION:
*val=RelayAPI_SWVersion;
return 0;
case VAL_VOLTAGE:
*val=RelayAPI_Voltage;
return 0;
case VAL_VERSION:
*val=RelayAPI_Version;
return 0;
case VAL_ISSMUD:
*val=RelayAPI_isSMUD;
return 0;
}
BYTE
가 unsigned char
으로 정의된다 (기능 second parameter
로 전달 된 val
에 대한 포인터를 따르십시오.) ... 다음과 같습니다. 내 Java 함수에서 그 GetVal
메서드를 호출해야합니다. 이 C 코드와 일치해야 내 Java 코드의 기능 ...
long val;
char buff[20];
if(!GetVal (VAL_SERIAL, &val)) {}
그리고이 나는 (I이, 당신이 참조를 사용할 수 없습니다 알 권리 아니라는 것을 알고 내 자바 코드에 지금까지 무엇을 가지고 그런 자바에서, 난 그냥 내가 가진 무엇을 보여주는거야).
public void updateForm() {
int val;
char buff[];
/**
* SERIAL NUMBER
*/
if(!GetVal(RelayAPIModel.VAL_SERIAL, &val)) { }
}
그래서, val
이 길이에, (내가 너무 잘 C를 모르는, 가정) null
로 참조를 초기화 함수를 통해 전달됩니다. 함수 내에서 val
에 대한 포인터에 값이 지정됩니다.
C에서 값을 참조하는 변수를 할당하는 NULL 변수에 대한 참조를 전달하는 메소드를 사용하고 있습니까?
편집 :
내가 위의 GETVAL 방법을 포함하는 라이브러리를 사용하고, 명확합니다. 두 번째 코드 블록이 나오는 Palm Pilot API를 미러링합니다. 세 번째 코드 블록은 Java에서 C 라이브러리의 GetVal 메서드에 대한 호출입니다.
당신의 JNI 래퍼 함수를 게시 할 수 있습니까? – Renard
나는 기꺼이 하겠지만 래퍼 함수는 무엇을 의미합니까? – JuiCe
자바에서 native c를 호출하기 위해 jni를 사용한다고 가정합니다. 그렇다면 jni 코드를 게시하십시오. – Renard