Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNA:java.lang.Error:内存访问无效-TS3库_Java_Jna - Fatal编程技术网

JNA:java.lang.Error:内存访问无效-TS3库

JNA:java.lang.Error:内存访问无效-TS3库,java,jna,Java,Jna,我使用JNA从Java访问一些dll函数,该dll本机函数声明如下: unsigned int ts3client_initClientLib(const struct ClientUIFunctions* functionPointers, const struct ClientUIFunctionsRare* functionRarePointers, int usedLogTypes, const char* logFileFolder, const char* resourcesFold

我使用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);
因此,我在库接口中声明如下:

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;
    }
}
正确的解决方案:

创建事件接口:

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;
    }
}

最有可能的是,目标函数想要一个非空结构,其中包含给它一个空指针的回调。最有可能的是,目标函数想要一个非空结构,其中包含给它一个空指针的回调。最有可能的是,目标函数想要一个非空结构,其中包含给它一个空指针的回调它是一个空指针。