使用NDK时的指针/参考

时间:2012-07-06 13:31:39

标签: android pointers reference android-ndk

我正在创建一个Android应用程序,它从C库中提取方法。 C库中使用的方法之一看起来像这样......(按照指向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;
}

BYTE被定义为unsigned char。我需要从我的Java函数中调用GetVal方法。我的Java代码的功能应与此C代码匹配...

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

这就是我目前在Java代码中所拥有的内容(我知道这是不对的,我知道你不能在Java中使用引用,我只是向你展示我的内容。):< / p>

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

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

因此,val初始化为null(我假设,我不太了解C),对此long的引用通过函数传递。在函数内,指向val的指针被赋值。

无论如何在C中使用一个方法,它传递一个NULL变量的引用,然后赋值引用一个值?

编辑:

为了澄清,我使用的是一个包含上面GetVal方法的库。我正在镜像Palm Pilot API,这是第二个代码块的来源。第三个代码块是我从Java调用到C库中的GetVal方法。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望GetVal方法更改传入的参数。由于java没有指针,因此您需要创建一个简单的java类,您可以在c代码中进行操作。

由于我不知道你的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
}