【问题标题】:Calling C function from java using JNI使用JNI从java调用C函数
【发布时间】:2023-04-09 11:09:01
【问题描述】:

我有以下 C 代码。我的目标是从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 函数并获得响应?

【问题讨论】:

  • 我已经使用这个tutorial 完成了JNI。它会解决你的问题。
  • @Ajith John 我最大的问题是如何将值传递给函数并返回字节通知

标签: java c


【解决方案1】:

你尝试过简单的实现吗?

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 字符串复制到本地缓冲区。

这段代码我没有编译,只是写的。如果需要,进行基本的更正。

【讨论】:

  • 我从 java 得到 -80 但想要像 0xB0 一样响应。请协助。
  • @NemugaM 这是因为 java 字节已签名。 0xb0 is -80 在 8 位二进制补码中。你得到了预期的价值。
  • 如何将其转换为 0xb0
  • 要么用 jint 替换每个 jbytejbyte port 除外)并相应地更新您的 Java 定义(以便 java 方法返回 int)或查看此 answer
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多