如何使用 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 代码与 C 代码进行比较时,您会发现在 C 中,您将第一个函数调用的返回值直接传递给第二个函数调用。在 Java 示例中,您将从中创建另一个指针。但没有必要这样做。你的第一个方法调用已经返回一个指针,像在 C 中一样直接传递它。
我不知道
N2QLibConnCreate
的作用以及是否需要回调参数。如果是这样,您还必须创建 N2q_callback_proc 的实例并传递它而不是 null。