4 messages in net.java.dev.jna.users[jna-users] Windows DLL containing C+...
FromSent OnAttachments
Steve Sobol (JDN)Nov 9, 2008 4:48 pm 
Timothy WallNov 10, 2008 5:42 am 
Steve SobolNov 13, 2008 10:28 pm 
Steve Sobol (JDN)Nov 14, 2008 6:55 am 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:[jna-users] Windows DLL containing C++ ClassActions...
From:Steve Sobol (JDN) (java@SteveSobol.com)
Date:Nov 9, 2008 4:48:37 pm
List:net.java.dev.jna.users

Hello,

I'm trying to use the EchoWare SDK (http://www.echogent.com) from Java. EchoWare essentially allows you to tunnel TCP connections through a central server.

The DLL contains the following functions:

bool InitializeProxyDll ()

char* GetDllVersion() void SetLoggingOptions(bool bEnablelogging, char *szLogPath) void* CreateProxyInfoClassObject () void DeleteProxyInfoClassObject (void* pProxyInfo) bool SetPortForOffLoadingData(int DataOffLoadingPort) bool SetPortForOffLoadingDataType (void* pProxyInfo, int DataOffLoadingPort, char* szConnectionType, char* AppID) void AutoConnect() int ConnectProxy(void* pProxyInfo) bool DisconnectProxy(void* pProxyInfo) bool DisconnectAllProxies() int EstablishNewDataChannel(void* pProxyInfo , char* IDOfPartner) int EstablishNewDataChannelType(void* pProxyInfo , char* IDOfPartner, char* szConnectionType) int EstablishServerMirrorType(void* pProxyInfo , char* IDOfPartner, char* szConnectionType, char* port) void EndServerMirror(void* pProxyInfo , char* port) void SetEncryptionLevel(int level, void* pProxyInfo) void SetLocalProxyInfo(char* ip, char* port, char* username, char* password) LONG GetMyGroups(void* pProxyInfo , char *buffer, int nLen) LONG GetMyPeers(void* pProxyInfo , char* groupname, char *buffer, int nLen)

And here's my Java interface:

package com.lobosstudios.echoj;

import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.NativeLong; import com.sun.jna.Pointer;

public interface Echoware extends Library {

Echoware INSTANCE = (Echoware) Native.loadLibrary("echoware",Echoware.class); boolean InitializeProxyDll(); String GetDllVersion(); void SetLoggingOptions(boolean bEnablelogging, String szLogPath); Pointer CreateProxyInfoClassObject(); void DeleteProxyInfoClassObject(Pointer pProxyInfo); boolean SetPortForOffLoadingData(int DataOffLoadingPort); boolean SetPortForOffLoadingDataType(Pointer pProxyInfo,int DataOffLoadingPort, String szConnectionType, String AppID); void AutoConnect(); int ConnectProxy(Pointer pProxyInfo); boolean DisconnectProxy(Pointer pProxyInfo); boolean DisconnectAllProxies(); int EstablishNewDataChannel(Pointer pProxyInfo, String IDOfPartner); int EstablishNewDataChannelType(Pointer pProxyInfo, String IDOfPartner, String szConnectionType); int EstablishServerMirrorType(Pointer pProxyInfo, String IDOfPartner,String szConnectionType, String port); void EndServerMirror(Pointer pProxyInfo, String port); void SetEncryptionLevel(int level, Pointer pProxyInfo); void SetLocalProxyInfo(String ip, String port, String username,String password); NativeLong GetMyGroups(Pointer pProxyInfo, String buffer, int nLen); NativeLong GetMyPeers(Pointer pProxyInfo, String groupname,String buffer, int nLen);

}

OK! So far, so good. But... note that there are several functions that either take a void pointer as an argument, or return a void pointer. The void pointer is actually a pointer to an IDllProxyInfo C++ object.

I don't think this would be a problem, except that once I have an instance of IDllProxyInfo, I need to call some of its methods.

How do I implement this? It's been a LONG time since the last time I did any C++ programming, but I recall that C++ objects are similar to C structures. Is this correct? How do I implement IDllProxyInfo in Java using JNA?

Here's IDllProxyInfo.h from the EchoWare SDK:

#ifndef _INTERFACE_DLL_PROXY_INFO_H #define _INTERFACE_DLL_PROXY_INFO_H

#if _MSC_VER > 1000 #pragma once #endif

//enum //{ // STATUS_MSG_BASE = WM_USER + 3000,

#define STATUS_CONNECTING 0x00000001 #define STATUS_CONNECTED 0x00000002 #define STATUS_AUTHENTICATING 0x00000004 #define STATUS_AUTHENTICATION_FAILED 0x00000008 #define STATUS_ESTABLISHING_DATA_CHANNEL 0x00000010 #define STATUS_SEARCHING_FOR_PARTNER 0x00000020 #define STATUS_DISCONNECTED_FROM_PROXY 0x00000040

// STATUS_MSG_LAST //};

enum { ERROR_CONNECTING_TO_PROXY = -1, CONNECTION_SUCCESSFUL, NO_PROXY_SERVER_FOUND_TO_CONNECT, AUTHENTICATION_FAILED, PROXY_ALREADY_CONNECTED, CONNECTION_TIMED_OUT, ID_FOUND_EMPTY };

class IDllProxyInfo { public: virtual void SetName(char* name) = 0; virtual void SetIPPort(char* ipport) = 0; virtual void SetIP(const char* ip) = 0; virtual void SetPort(const char* port) = 0; virtual void SetPassword(const char* pass) = 0; virtual void SetStatus(int Status, bool bStatus) = 0; virtual bool SetMyID(const char* MyID) = 0; virtual bool SetSocketTimeout(int connectTimeout, int ReceiveTimeout, int SendTimeout) =0; virtual void SetReconnectProxy(bool bReconnectProxy) = 0;

virtual const char* GetName() const= 0; virtual const char* GetIpPort() const= 0; virtual const char* GetIP() const= 0; virtual const char* GetPort() const= 0; virtual const char* GetPassword() const= 0; virtual int GetStatus() const= 0; virtual const char* GetMyID() const= 0; virtual bool GetReconnectProxy()const = 0; };

#endif

Thanks in advance, Steve