0

CライブラリからメソッドをプルするAndroidアプリを作成しています。Cライブラリで使用されるメソッドの1つは次のようになります...(val関数として渡されたものへのポインタに従ってくださいsecond parameter。)

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

ABYTEはとして定義されますunsigned charGetValJava関数からそのメソッドを呼び出す必要があります。私のJavaコードの機能は、このCコードと一致する必要があります...

long val;
char buff[20];
if( !GetVal (VAL_SERIAL, &val) ) {}

そして、これは私のJavaコードでこれまでに持っているものです(これが正しくないことを知っています。Javaでそのような参照を使用できないことを知っています。私が持っているものを示しているだけです。):

public void updateForm() {
    int val;
    char buff[];

    /**
    * SERIAL NUMBER
    */
    if( !GetVal( RelayAPIModel.VAL_SERIAL, &val ) ) { }
}

したがって、valは次のように初期化されますnull(私は、Cをあまりよく知らないと思います)、このlongへの参照は関数を介して渡されます。関数内で、へのポインタにval値が割り当てられます。

NULL変数への参照が渡され、参照されている変数に値を割り当てるCのメソッドを使用する方法はありますか?

編集 :

明確にするために、上記のGetValメソッドを含むライブラリを使用しています。2番目のコードブロックの元となるPalmPilotAPIをミラーリングしています。3番目のコードブロックは、JavaからCライブラリのGetValメソッドへの呼び出しです。

4

1 に答える 1

0

私があなたを正しく理解しているなら、GetValメソッドが渡されたパラメーターを変更することを望みます。javaにはポインタがないため、cコード内から操作できる単純なjavaクラスを作成する必要があります。

私はあなたのjniコードを知らないので、多くの推測をしなければならなかったので、ソースをそのまま使用しないでください。しかし、それはあなたを正しい軌道に乗せるはずです。

Javaコード

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

native boolean GetVal(int valSerial,LongWrapper val);

jniコードの例

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
}
于 2012-07-06T14:42:17.343 に答える