当前位置: 首页 > 知识库问答 >
问题:

在java应用程序中使用winapi。

虞承泽
2023-03-14

我尝试在JAVA代码中调用MessageBoxA函数。以下方法有什么问题,以至于我的程序抛出了很多错误?

package loading.libraries;

public class User32
{
    //first case:public native int MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
    //second: public native int MessageBoxA(int hWnd,String lpText,String lpCaption,int uType);
    static  
    {
        System.loadLibrary("User32");
    }        

}
package loading.libraries;

public class LoadingLibraries 
{
    public static void main(String[] args) 
    {
        User32 hwapi = new User32();

        hwapi.MessageBoxA(0,"Hello","World",0);               
    }
}

1-st:

run:线程“main”java.lang.ClassFormatError:java.lang.ClassLoader的类文件加载/库/MessageBox中的本机或抽象方法中的代码属性。java.lang.ClassLoader.defineClass(ClassLoader.java:791)处的defineClass1(本机方法),javahtml" target="_blank">.net.URLClassLoad处的java.net.SecureClassLoader。defineClass(URLClassLoader.java:355)。doPrivilege(本机方法)位于java.net.URLClassLoader.findClass(URLClass Loader.java:354),位于java.lang.ClassLoad er.loadClass,位于sun.misc.Launcher$AppClassLoader.load Class(Launcher.java:308),位于java.lang.CassLoader.roadClasss(ClassLoadingLibrarys.main(Loadinglibrarys.java:8)java结果:1 BUILD SUCCESSFUL(总时间:2秒)

第2-:

run:线程“main”中出现异常Java . lang . unsatisfiedlinkerror:loading . libraries . user 32 . messagebox a(il Java/lang/String;ljava/lang/String;I)I at loading . libraries . user 32 . messagebox a(本机方法)at loading . libraries . loading libraries . main(loading libraries . Java:10)Java结果:1次构建成功(总时间:0秒)

共有3个答案

徐隐水
2023-03-14

您正在使用Java JNI。JNI不能只调用任何DLL方法,而只能从JVM调用方法。DLL中的C方法签名应与JNI规范中定义的Java方法签名匹配。

  • http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/jniTOC.html

例如这个C函数

include "jni.h"

JNIEXPORT jobject JNICALL Java_net_sf_sevenzipjbinding_SevenZip_nativeOpenArchive(JNIEnv * env,
     jclass thiz, jstring formatName, jobject inStream,
     jobject archiveOpenCallbackImpl) { ... }

可以使用以下本机方法声明从Java中调用:

package net.sf.sevenzipjbinding;

class public class SevenZip {
    private static native ISevenZipInArchive nativeOpenArchive(String formatName, IInStream inStream,
        IArchiveOpenCallback archiveOpenCallback) throws SevenZipException;
    ...
}

如您所见,DLL中导出的名称应该与java包、类名和方法名相匹配。函数签名应该对应于使用jni.h中定义的类型的java签名

例子来自https://github.com/borisbrodski/sevenzipjbinding/

暨弘懿
2023-03-14

您需要创建一个包装器来调用User32库中的这些函数。不要直接调用它们。看看本教程http://www.ibm.com/developerworks/java/tutorials/j-jni/.

除了简单地加载库并调用函数之外,还需要更多的步骤。还必须注意,如果您这样做,您将删除Java中最棒的东西之一。能够随时随地写一次。您将连接到Windows。如果这对你来说不是问题,那就没什么大不了的。你确定这不是你不能直接从Java做的事情吗。JNI真的应该是最后的手段。

此外,根据我对 JNI 的经验,如果不小心使用,它可能会导致应用程序不稳定。

乐寒
2023-03-14

使用JNI调用本机代码不像您尝试的那么简单。您正在调用的DLL中的函数必须符合某个接口,而任意函数(例如WindowsUser32.dll)不符合JNI期望的格式

您可以编写包装器 DLL,这意味着您可以使用可从 Java 调用的 JNI API 在 C 中编写一些代码。

另一种方法是使用JNA,它比JNI更容易使用,并且允许您调用任意DLL中的函数,而无需自己编写本机代码。

 类似资料:
  • 我试图理解我们什么时候需要使用这个应用程序。在我们的node Express中使用 当我在网上搜索时,我在reddit上偶然发现了这个答案,它说明了应用程序之间的区别。获取和应用程序。使用 在此基础上,我总结了以下几点。 充当超级路由或中间件?这意味着它在? 此外,如果有人能添加更多关于app.use.的信息/练习,我将不胜感激

  • 问题内容: 我已经从http://code.google.com/p/facebook-java- api/ 下载了facebook-java- api-3.0.2-bin 以连接到脸书。我想在我的Java应用程序中使用此api连接Facebook。我正在为此目的开发桌面应用程序。我已经在Face book上创建了帐户并注册为开发人员。 是否可以从我的Java应用程序连接Facebook? 如果是

  • 我需要你的帮助:我必须读卡与RFID阅读器,在我的java应用程序。最后,当我点击按钮“Attributer Numéro RFID”时,它会读取我的RFID阅读器(型号:OCS ACRurw),然后将十六进制值插入jtextfield文本区域。(一开始,jTable会得到我数据库中每个用户的姓和名。这是我项目的代码。如果有人知道我点击“Attributer Numéro RFID”按钮时如何读取

  • 在99%的情况下,当SQL server返回意外错误或文件系统中缺少文件时,我不能做任何合理的事情,我只想记录这种情况并将错误返回给用户。所以我看不出有什么理由应该返回“err”手动展开堆栈,实际上我会丢失stacktrace和上下文,并且更难找到错误的原因。 有没有什么我错过了,所以这种方法不会很好地工作?似乎大多数Go文章都建议不要使用panic/recover,但我不明白为什么。它看起来非常

  • 问题内容: 我想在我的Java应用程序中使用Windows NTLM认证来透明地认证Intranet用户。如果使用浏览器(单点登录),用户将不会注意到任何身份验证。 我发现了一些具有NTLM支持的库,但是不知道要使用哪个库: http://spnego.sourceforge.net/ http://sourceforge.net/projects/ntlmv2auth/ http://jcifs

  • 我不知道如何用GraalVM的SDK编译我的Java应用程序。我相信在使用GraalVMbinary时,默认情况下会将它们添加到类路径中。 我的hello world测试应用程序: 输出: 我使用的是用OpenJDK 11构建的GraalVM二进制文件: 当深入挖掘时,我发现这些类包含在其中。jmod档案位于: