0
我有一個類的Modbus多個實例
public class Modbus {
// init TCP
public native void init(String ip, int port, int id);
public native short[] read_registers(int slaveid, int addr, int len);
在init方法id
,將被打印到,如果我執行read_registers
如果我做標準輸出
Modbus mb1 = new Modbus("192.168.0.250", 502, 1);
Modbus mb2 = new Modbus("192.168.0.250", 502, 2);
然後
mb1.read_registers(....);
mb2.read_registers(....);
在這兩種情況下,它將2
打印到標準輸出。所以看起來第二個實例會覆蓋第一個實例。我如何使用jni-wrapper的多個實例?
編輯:
這裏我使用的C代碼,我的目標是要用到的samre或不同的Modbus設備
#include "eu_company_lib_comm_modbus_Modbus.h"
#include <modbus/modbus-rtu.h>
#include <modbus/modbus.h>
#include <errno.h>
modbus_t *mb;
int readError;
int writeError;
int errnr;
const char* errStr;
int c_id;
JNIEXPORT void JNICALL
Java_eu_company_lib_comm_modbus_Modbus_init__Ljava_lang_String_2I(
JNIEnv * env, jobject obj, jstring ip, jint port, jint id) {
const char* c_ip = (*env)->GetStringUTFChars(env, ip, 0);
mb = modbus_new_tcp(c_ip, port);
c_id=id;
if (mb == NULL) {
fprintf(stderr, "Unable to allocate libmodbus context\n");
fflush(stderr);
return;
}
modbus_set_debug(mb, 1);
if (modbus_connect(mb) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
fflush(stderr);
modbus_free(mb);
return;
}
(*env)->ReleaseStringUTFChars(env, ip, c_ip);
}
JNIEXPORT jshortArray JNICALL Java_eu_company_lib_comm_modbus_Modbus_read_1registers(
JNIEnv * env, jobject obj, jint slave_id, jint address, jint len) {
jshortArray result = (*env)->NewShortArray(env, len);
uint16_t tab_reg[len];
printf("%d\n",c_id);
fflush(stdout);
readError = modbus_read_registers(mb, address, len, tab_reg);
errnr = errno;
errStr = modbus_strerror(errno);
(*env)->SetShortArrayRegion(env, result, 0, len, tab_reg);
return result;
}
抱歉,閱讀你的心靈的#1水晶球是當今缺陷 - 您必須編輯您的問題並添加更多關於Modbus類和您使用的本地實施的詳細信息(例如更多代碼)。 – Robert
@Robert done ... – user2071938
那麼,在你使用全局變量如'int c_id;'的JNI部分中,答案很簡單 - 如果你這樣做了,你不能指望它可以與多個實例一起工作。 – Robert