2012-07-06 3 views
0

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; 
} 

BYTEunsigned 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 메서드에 대한 호출입니다.

+0

당신의 JNI 래퍼 함수를 ​​게시 할 수 있습니까? – Renard

+0

나는 기꺼이 하겠지만 래퍼 함수는 무엇을 의미합니까? – JuiCe

+0

자바에서 native c를 호출하기 위해 jni를 사용한다고 가정합니다. 그렇다면 jni 코드를 게시하십시오. – Renard

답변

0

정확하게 이해하면 GetVal 메서드가 전달 된 매개 변수를 변경하려고합니다. java에는 포인터가 없으므로 간단한 Java 클래스를 작성해야만 C 코드에서 조작 할 수 있습니다.

나는 당신의 jni 코드를 알지 못하기 때문에 많은 추측을해야했기 때문에 소스를 그대로 사용하지 마십시오. 하지만 올바른 방향으로 가야합니다. JNI 코드의

자바 코드

class LongWrapper { 
    private long mValue; 
    public void setValue(final long value){ 
     mValue = value; 
    } 
} 

native boolean GetVal(int valSerial,LongWrapper val); 

jboolean Java_com_foo_GetVal(JNIEnv *env, jint val_serial, jobject longObj) 
{ 
    jclass cls = env->GetObjectClass(longObj); 
    jmethodID mid = env->GetMethodID(cls, "setValue", "(J)V"); 
    if (mid == 0) { 
     return false; 
    } 
    jlong val=0; 
    bool result = GetVal(val_serial,&val) 
    env->CallLongMethod(longObj,mid, val); 
    return result 
} 
+0

고맙습니다. 그게 내가하고 싶은 일입니다. 그러나, 나는 C 코드를 변경하지 않고 그것을 해내려고 노력하고있다. 그게 가능한가? – JuiCe

+0

공용 데이터 필드가있는 Java 클래스가 사용합니다. 그런 식으로 JNI 배관. –

+0

@JuiCe : 자바는 원시 참조 나 매개 변수를 지원하지 않습니다. 그래서 아니야. –