我正在创建一个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方法。
答案 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
}