Java JNA 获取和传递本机指针

问题描述 投票:0回答:1

如何使用 Java JNA 从本机方法获取指针并将其传递给另一个本机方法?

//C code .h
...
extern "C" HN2QCONN __stdcall N2QLibConnCreate(LPCTSTR lpszIniFile, LPCTSTR lpszSection, 
                                               N2Q_CALLBACK_PROC Callback);
extern "C" BOOL __stdcall N2QLibConnectQuik(HN2QCONN hConn);
...
//another C code .h
...
DECLARE_HANDLE (HN2QCONN);
...
//test C code .cpp
HN2QCONN hConn = N2QLibConnCreate("n2q.ini", "local", CallbackProc);
if (!N2QLibConnectQuik(hConn))                              
        printf("error connect to server.");

我如何在 Java 中做同样的事情?如何正确从本机方法获取数据并使用托管代码将其传回本机方法?

我正在尝试这样做:

//java code
...
public interface N2q_lib extends Library {
    N2q_lib INSTANCE = (N2q_lib)Native.load("n2q_lib.dll", N2q_lib.class);
    Pointer N2QLibConnCreate(String lpszIniFile, String lpszSection, N2q_callback_proc Callback);
    boolean N2QLibConnectQuik(Pointer ptr);
}
...
public class App 
{
    public static void main( String[] args )
    {
        Pointer ptr = new Memory(N2q_lib.INSTANCE.N2QLibConnCreate("n2q.ini", "local", null));
        if (!N2q_lib.INSTANCE.N2QLibConnectQuik(ptr))
            System.out.println("error connect to server.");
    }
}

但我总是得到“假”。我是否错误地使用了指针?

java java-native-interface jna
1个回答
0
投票

当您将 Java 代码与 C 代码进行比较时,您会发现在 C 中,您将第一个函数调用的返回值直接传递给第二个函数调用。在 Java 示例中,您将从中创建另一个指针。但没有必要这样做。你的第一个方法调用已经返回一个指针,像在 C 中一样直接传递它。

我不知道

N2QLibConnCreate
的作用以及是否需要回调参数。如果是这样,您还必须创建 N2q_callback_proc 的实例并传递它而不是 null。

© www.soinside.com 2019 - 2024. All rights reserved.