2016-07-28 148 views
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

抱歉,閱讀你的心靈的#1水晶球是當今缺陷 - 您必須編輯您的問題並添加更多關於Modbus類和您使用的本地實施的詳細信息(例如更多代碼)。 – Robert

+0

@Robert done ... – user2071938

+1

那麼,在你使用全局變量如'int c_id;'的JNI部分中,答案很簡單 - 如果你這樣做了,你不能指望它可以與多個實例一起工作。 – Robert

回答

1

你的主要問題多連接的是,在JNI部分你正在使用全局變量。全局變量。因此,這些變量與Modbus實例無關。

從我的觀點,你應該從JNI移動儘可能多的代碼放到Java實現的ModBus和使用本地字段,用於存儲有關Java中所有你需要的持久值的JNI層面上看:

公共類的Modbus {

private final String ip; 
private final int port; 
private final int id; 

public ModBus(String ip, int port, ind id) { 
    this.ip = ip; 
    this.port = port; 
    this.id = id; 
}  

// init TCP 
public native void init(String ip, int port, int id); 
public native short[] read_registers(int slaveid, int addr, int len); 

}

在JNI方面,你可以訪問人在Java領域使用JNI方法GetObjectClass(..)GetFieldID(..)GetObjectField(..)檢索值。

搜索例如,你會發現很多C和C++的例子。

或者你可以讓本地方法私人和補充說,在每一個呼叫提供所需的值到JNI部分的包裝方法:

public void init() { 
    init(ip, port, id); 
} 

private native void init(String ip, int port, int id);