JNA: java.lang.Error: Invalid memory access - TS3 Library
JNA: java.lang.Error: Invalid memory access - TS3 Library
我正在使用 JNA 从 Java 访问某些 dll 函数,此 dll 本机函数声明如下:
unsigned int ts3client_initClientLib(const struct ClientUIFunctions* functionPointers, const struct ClientUIFunctionsRare* functionRarePointers, int usedLogTypes, const char* logFileFolder, const char* resourcesFolder);
因此,我在库接口中声明如下:
int ts3client_initClientLib(Structure functionPointers, Structure functionRarePointers, int usedLogTypes, String logFileFolder, String resourcesFolder);
然后我这样称呼它:
ts3client_initClientLib(null, null, 1, "log.log", "soundbackends");
但我收到以下异常:
Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokeInt(Native Method)
at com.sun.jna.Function.invoke(Function.java:383)
at com.sun.jna.Function.invoke(Function.java:315)
at com.sun.jna.Library$Handler.invoke(Library.java:212)
at com.sun.proxy.$Proxy0.ts3client_initClientLib(Unknown Source)
at pl.edu.tirex.ts3musicbot.MusicBot.main(MusicBot.java:17)
正确答案:
创建事件接口:
import com.sun.jna;
public interface ServerErrorEvent implements Callback
{
void invoke(long serverConnectionHandlerID, String errorMessage, int error, String returnCode, String extraMessage);
}
创建客户端UI函数结构:
import com.sun.jna.Structure;
public class EventsStructure extends Structure
{
public ServerErrorEvent onServerErrorEvent;
@SuppressWarnings("rawtypes")
@Override
protected List<String> getFieldOrder()
{
List<String> fields = new ArrayList<String>();
for (Field f : this.getClass().getDeclaredFields())
{
boolean has = false;
for (Class<?> c : f.getType().getInterfaces())
{
if (c.equals(DefaultEvent.class))
{
has = true;
}
}
if (has)
{
fields.add(f.getName());
}
}
return fields;
}
}
使用以下方法:
EventsStructure eventStructure = new EventsStructure();
eventStructure.onServerErrorEvent = new ServerErrorEvent() //implement server error event
{
@Override
public void invoke(long serverConnectionHandlerID, String errorMessage, int error, String returnCode, String extraMessage)
{
System.out.println("server error");
}
};
ts3client_initClientLib(eventStructure, null, 0, "logs", "soundbackends"); //invoke ts3client_initClientLib function from library
我正在使用 JNA 从 Java 访问某些 dll 函数,此 dll 本机函数声明如下:
unsigned int ts3client_initClientLib(const struct ClientUIFunctions* functionPointers, const struct ClientUIFunctionsRare* functionRarePointers, int usedLogTypes, const char* logFileFolder, const char* resourcesFolder);
因此,我在库接口中声明如下:
int ts3client_initClientLib(Structure functionPointers, Structure functionRarePointers, int usedLogTypes, String logFileFolder, String resourcesFolder);
然后我这样称呼它:
ts3client_initClientLib(null, null, 1, "log.log", "soundbackends");
但我收到以下异常:
Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokeInt(Native Method)
at com.sun.jna.Function.invoke(Function.java:383)
at com.sun.jna.Function.invoke(Function.java:315)
at com.sun.jna.Library$Handler.invoke(Library.java:212)
at com.sun.proxy.$Proxy0.ts3client_initClientLib(Unknown Source)
at pl.edu.tirex.ts3musicbot.MusicBot.main(MusicBot.java:17)
正确答案:
创建事件接口:
import com.sun.jna;
public interface ServerErrorEvent implements Callback
{
void invoke(long serverConnectionHandlerID, String errorMessage, int error, String returnCode, String extraMessage);
}
创建客户端UI函数结构:
import com.sun.jna.Structure;
public class EventsStructure extends Structure
{
public ServerErrorEvent onServerErrorEvent;
@SuppressWarnings("rawtypes")
@Override
protected List<String> getFieldOrder()
{
List<String> fields = new ArrayList<String>();
for (Field f : this.getClass().getDeclaredFields())
{
boolean has = false;
for (Class<?> c : f.getType().getInterfaces())
{
if (c.equals(DefaultEvent.class))
{
has = true;
}
}
if (has)
{
fields.add(f.getName());
}
}
return fields;
}
}
使用以下方法:
EventsStructure eventStructure = new EventsStructure();
eventStructure.onServerErrorEvent = new ServerErrorEvent() //implement server error event
{
@Override
public void invoke(long serverConnectionHandlerID, String errorMessage, int error, String returnCode, String extraMessage)
{
System.out.println("server error");
}
};
ts3client_initClientLib(eventStructure, null, 0, "logs", "soundbackends"); //invoke ts3client_initClientLib function from library