2015-07-01 129 views
-1

我有以下C代码。我的目标是从java中调用C函数。使用JNI从java调用C函数

C代码:

_declspec(dllimport) BYTE __stdcall CPSC1900Connect(BYTE port, void *param); 



JNIEXPORT jbyte JNICALL Java_CPSE_CPSC1900Connect(JNIEnv * env, jclass hPrinter, jbyte port, jstring Answer) 
{ 

    BYTE RC; 

// I need to call CPSC1900Connect(BYTE port, void *param); function and pass (i DONT KNOW HOW TO PASS THOSE PAREMETER TO THIS METHOD. 

//port and ANSWER PARAMETER. THE METHOD RETURNS BYTE WHICH I SHOULD BE VIED FROM JAVA 

    return Answer; 
} 

java代码:

public class CPSE { 

    public native byte CPSC1900Connect(byte port,String param); 
    public native String CPSC1900Disconnect(String param); 
    static{ 

     try { 

      System.loadLibrary("dll/CPSLPT9x"); 
      System.loadLibrary("dll/CPSRC"); 
      System.loadLibrary("dll/CPSE"); 
      System.loadLibrary("dll/MCHIP"); 


     } catch (Exception e) { 
      System.out.println(e); 
     } 

    } 

    public CPSE() { 

     byte port=CPSC1900_USB; 
        param ="xx.xx.xx.xx"// ip address 
     byte response= CPSC1900Connect(BYTE port, void *param); 


    } 

    public static void main(String[] args) 
    { 
     new CPSE(); 

    } 

} 

我的问题是:如何从Java应用程序中传递价值,并把它传递给C函数,并得到回应?

+0

我已经使用这个[tutorial](http://www.ibm.com/developerworks/java/tutorials/j-jni/j-jni.html)完成了JNI。 它会解决你的问题。 –

+0

@Jithith John我最大的问题是如何将值传递给函数,并返回字节 – NemugaM

回答

0

您是否尝试过直接的实现?

JNIEXPORT jbyte JNICALL Java_CPSE_CPSC1900Connect(JNIEnv * env, jclass hPrinter, jbyte port, jstring Answer) 
{ 

    const char* param = (*env)->GetStringUTFChars(env, Answer, 0); 
    jbyte res = (jbyte)CPSC1900Connect((BYTE)port, (void*)param); 

    (*env)->ReleaseStringUTFChars(env, Answer, param); 

    return res; 
} 

这个假设的CPSC1900Connectvoid* param是只读的,否则param字符串复制到本地缓存。

我还没有编译这个代码,就这么写了。根据需要进行基本的更正。

+0

的通知从java获得-80,但想要响应像0xB0。请协助。 – NemugaM

+0

@NemugaM这是因为java字节被签名。 * 0xb0 * *是8位二进制补码中的* -80。你正在获得预期的价值。 –

+0

如何将它转换为0xb0 – NemugaM