Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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
Java JNA内存访问无效_Java_C++_Jna - Fatal编程技术网

Java JNA内存访问无效

Java JNA内存访问无效,java,c++,jna,Java,C++,Jna,在包装大dll之前,我正在测试JNA。具有不同类型args的基本函数可以工作。但当我们包装(即使是简单的)内部有标准方法的批准代码时,会出现: Exception in thread "main" java.lang.Error: Invalid memory access at com.sun.jna.Native.invokePointer(Native Method) at com.sun.jna.Function.invokePointer(Funct

在包装大dll之前,我正在测试JNA。具有不同类型args的基本函数可以工作。但当我们包装(即使是简单的)内部有标准方法的批准代码时,会出现:

Exception in thread "main" java.lang.Error: Invalid memory access
    at com.sun.jna.Native.invokePointer(Native Method)
    at com.sun.jna.Function.invokePointer(Function.java:490)
    at com.sun.jna.Function.invokeString(Function.java:654)
    at com.sun.jna.Function.invoke(Function.java:427)
    at com.sun.jna.Function.invoke(Function.java:354)
    at com.sun.jna.Library$Handler.invoke(Library.java:244)
    at com.sun.proxy.$Proxy0.TestWCHAR_in(Unknown Source)
    at gov.nbu.App.main(App.java:85)

所有版本都是32位。

问题不在JNA中。它出现在某些机器(我的机箱)的Cpp侧。这是:

void TestVoid(void)
{
    wchar_t                     wcBuffer[2600]      = {};
    size_t                      szOut               = 0;
    std::string                 Path                = "This message for test WCHAR.";
    errno_t                     errCode             = 0;

    // Work:
    errCode = mbstowcs_s(&szOut, wcBuffer, sizeof(wcBuffer), (char*)Path.c_str(), Path.size());
    // Not work:
    errCode = mbstowcs_s(&szOut, wcBuffer, Path.size(), (char*)Path.c_str(), Path.size()); 
}

问题不在JNA。它出现在某些机器(我的机箱)的Cpp侧。这是:

void TestVoid(void)
{
    wchar_t                     wcBuffer[2600]      = {};
    size_t                      szOut               = 0;
    std::string                 Path                = "This message for test WCHAR.";
    errno_t                     errCode             = 0;

    // Work:
    errCode = mbstowcs_s(&szOut, wcBuffer, sizeof(wcBuffer), (char*)Path.c_str(), Path.size());
    // Not work:
    errCode = mbstowcs_s(&szOut, wcBuffer, Path.size(), (char*)Path.c_str(), Path.size()); 
}

不要在应该发送
WString
const-char*
)的位置发送
String
const-wchar*
)。您可以进行设置,使
String
自动默认为
const wchar\u t*
而不是
const char*
,但这是另一个问题。@technomage,即使在没有参数的无效方法中也会出现错误。因为您正在调用WinAPI函数,您是否记得从
StdCallLibrary
扩展而不是
Library
?@cubrr,是的。结果相同。您能用Java和本机语言显示引发此异常的示例函数吗?不要在应该发送
WString
const-char*
)的位置发送
WString
const-wchar\u*
)。您可以进行设置,使
String
自动默认为
const wchar\u t*
而不是
const char*
,但这是另一个问题。@technomage,即使在没有参数的无效方法中也会出现错误。因为您正在调用WinAPI函数,您是否记得从
StdCallLibrary
扩展而不是
Library
?@cubrr,是的。结果相同。您能用Java和本机语言显示一个引发此异常的示例函数吗?如果缓冲区大小报告不足,怎么会导致“无效内存访问”?如果缓冲区大小报告不足,怎么会导致“无效内存访问”?