0

我正在创建一个从 C 库中提取方法的 Android 应用程序。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;
}

ABYTE被定义为unsigned char。我需要GetVal从我的 Java 函数中调用该方法。我的 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被赋值。

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

编辑 :

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

4

1 回答 1

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