我试图通过引用可能的重复项来解决这个问题,但它们似乎都没有帮助。
这是我用来调用Java中的Win API方法以获取当前Windows用户名和本机Windows MessageBox的代码,但我得到的UnsatisfiedLinkError
表示我的代码无法找到我想要调用的native
方法。
public class TestNative
{
public static void main(String[] args)
{
long[] buffer= { 128 };
StringBuffer username = new StringBuffer((int)buffer[0]);
GetUserNameA(username,buffer);
System.out.println("Current User : "+username);
MessageBoxA(0,"UserName : "+username,"Box from Java",0);
}
/** @dll.import("ADVAPI32") */
static native void GetUserNameA(StringBuffer username,long[] buffer);
/** @dll.import("USER32") */
private static native int MessageBoxA(int h,String txt,String title,int style);
}
在Java中调用本机Windows方法可能是什么(相对简单)的解决方案。我意识到它会破坏Java作为跨平台语言的原因,但我需要开发一个用Java开发的项目,用Java开发。
感谢。
更新
正如David Heffernan建议的那样,我已尝试将MessageBox
的方法签名更改为MessageBoxA
,但仍然无效。
答案 0 :(得分:2)
我猜它与签名不完全匹配有关。
GetUserName函数有两个参数:LPTSTR和LPDWORD。 Java可能无法处理充当TCHAR数组的StringBuffer。
另外,为什么还要使用Windows API呢? Java可能会获得用户的登录名(快速google说:System.getProperty(“user.name”)),而Swing可以创建一个消息框(即使是一个看起来像Windows的消息框)。
答案 1 :(得分:1)
您是否尝试过https://github.com/twall/jna。我听过很多好东西,并且应该通过许多方便和简化使jni变得更容易。
答案 2 :(得分:0)
你有一个-Djava.library.path VM arg设置了DLL的路径吗?或者,您可以在系统路径中使用它。
答案 3 :(得分:0)
错误是因为没有MessageBox。你可能意味着MessageBoxA。