簡體   English   中英

錯誤“發生 JNI 錯誤。請檢查您的安裝並在 Eclipse x86 Windows 8.1 中重試”

[英]Error "A JNI error has occurred. Please check your installation and try again in Eclipse x86 Windows 8.1"

考慮:

public class LoginCumReg implements ActionListener, KeyListener {

    private JFrame form;
    private JTextField txtunm;
    private JTextField txtnm;
    private JTextField txteml;
    private JButton cmdcreate;
    private JPasswordField txtpass;
    private JPasswordField txtpassreg;
    private JButton cmdok;
    private JLabel lblunm;
    private JLabel lblpass;
    private JLabel lbleml;
    private JLabel lblpassreg;
    private JLabel lblnm;
    private JPanel panel_1;

    public LoginCumReg() {
        // Construct components
        form = new JFrame("Sign Up");
        form.getContentPane().setFont(
                new Font("Plantagenet Cherokee", Font.BOLD, 18));
        txtunm = new JTextField(5);
        txtunm.addKeyListener(this);
        txtunm.setBounds(637, 55, 100, 25);
        txtnm = new JTextField(5);
        txtnm.setBounds(637, 228, 100, 25);
        txteml = new JTextField(5);
        txteml.setBounds(637, 264, 100, 25);
        cmdcreate = new JButton("Create Account");
        cmdcreate.setBounds(527, 350, 188, 25);
        txtpass = new JPasswordField(5);
        txtpass.setBounds(637, 91, 100, 25);
        txtpassreg = new JPasswordField(5);
        txtpassreg.setBounds(637, 300, 100, 25);
        cmdok = new JButton("OK");
        cmdok.setBounds(527, 139, 100, 25);
        lblunm = new JLabel("UserName");
        lblunm.setBounds(527, 55, 73, 25);
        lblpass = new JLabel("Password");
        lblpass.setBounds(527, 91, 100, 25);
        lbleml = new JLabel("Email ID");
        lbleml.setBounds(527, 264, 100, 25);
        lblpassreg = new JLabel("Password");
        lblpassreg.setBounds(527, 300, 100, 25);
        lblnm = new JLabel("Full Name");
        lblnm.setBounds(527, 228, 100, 25);

        // form.setResizable(false);

        // Adjust size and set layout
        form.setPreferredSize(new Dimension(800, 450));

        form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        form.getContentPane().setLayout(null);

        // Add components
        form.getContentPane().add(txtunm);
        form.getContentPane().add(txtnm);
        form.getContentPane().add(txteml);
        form.getContentPane().add(cmdcreate);
        form.getContentPane().add(txtpass);
        form.getContentPane().add(txtpassreg);
        form.getContentPane().add(cmdok);
        form.getContentPane().add(lblunm);
        form.getContentPane().add(lblpass);
        form.getContentPane().add(lbleml);
        form.getContentPane().add(lblpassreg);
        form.getContentPane().add(lblnm);

        cmdcreate.setActionCommand("Create Account");
        cmdcreate.addActionListener(this);
        cmdok.setActionCommand("Login");

        JPanel panel = new JPanel();
        panel.setBounds(502, 29, 254, 154);
        panel.setFont(new Font("Palatino Linotype", Font.PLAIN, 14));
        panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.RAISED,
                null, null), "LOGIN", TitledBorder.LEADING, TitledBorder.TOP,
                null, null));
        panel.setBackground(SystemColor.controlHighlight);
        form.getContentPane().add(panel);

        panel_1 = new JPanel();
        panel_1.setBounds(500, 204, 254, 186);
        panel_1.setFont(new Font("Palatino Linotype", Font.PLAIN, 14));
        panel_1.setBorder(new TitledBorder(new EtchedBorder(
                EtchedBorder.RAISED, null, null), "SIGN UP",
                TitledBorder.LEADING, TitledBorder.TOP, null, null));
        panel_1.setBackground(SystemColor.controlHighlight);
        form.getContentPane().add(panel_1);

        JLabel lblNewLabel = new JLabel("New label");
        lblNewLabel.setBounds(91, 139, 286, 101);
        lblNewLabel.setIcon(new ImageIcon(
                "C:\\Users\\JAsh\\Desktop\\Projects\\JAsh.png"));
        form.getContentPane().add(lblNewLabel);

        JPanel panel_2 = new JPanel();
        panel_2.setBounds(77, 118, 315, 145);
        panel_2.setBorder(new EtchedBorder(EtchedBorder.RAISED,
                SystemColor.activeCaptionBorder, SystemColor.menu));
        panel_2.setBackground(SystemColor.controlHighlight);
        form.getContentPane().add(panel_2);
        cmdok.addActionListener(this);

        form.setResizable(false);
        form.pack();
        form.setVisible(true);
        System.out.println("const..");
    }

    public static void main(String[] args) {
        new LoginCumReg();
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        // TODO Auto-generated method stub

        if (ae.getActionCommand().equals("Create Account")) {
            new Registration(txtnm.getText(), txteml.getText(), new String(
                    txtpassreg.getPassword()));
            form.setVisible(false);
        }

        if (ae.getActionCommand().equals("Login")) {
            try {
                if (txtunm.getText().equalsIgnoreCase("admin")
                        && new String(txtpass.getPassword()).equals("admin")) {
                    form.setVisible(false);
                    new Admin();
                } else {
                    DataBase db = new DataBase();
                    db.connect();
                    String sql = "SELECT * FROM LOGIN WHERE USERNAME='"
                            + txtunm.getText() + "'";
                    ResultSet rs = db.getDDL(sql);
                    boolean found = false;
                    while (rs.next()) {
                        if (rs.getString("Password").equals(
                                new String(txtpass.getPassword()))) {
                            found = true;
                            form.setVisible(false);
                            String name = rs.getString("FullName");
                            Session.startSession(txtunm.getText(), name);
                            new FacultyWelcome();
                        }
                    }
                    if (!found)
                        JOptionPane.showMessageDialog(new JFrame(),
                                "Invalid Credentials");
                    db.close();
                }
            }
            catch (Exception e) {
            }
        }
    }

    @Override
    public void keyPressed(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void keyTyped(KeyEvent arg0) {

        // TODO Auto-generated method stub
        // JOptionPane.showMessageDialog(new JFrame(), arg0.getKeyChar() + "-" + arg0.getKeyCode());
    }
}

上面的代碼在我朋友的筆記本電腦上完美運行,並在我的筆記本電腦上拋出了這個錯誤。 我已經使用 Java 7 在Eclipse v4.2 (Juno) 上運行代碼。

我還在我的筆記本電腦上測試並運行了很多 Java 程序,都運行良好。 這是唯一給出此類錯誤的程序。

我該如何解決這個問題?

我一直有這個問題,但現在我已經弄清楚了。

事實證明,Java JDK 12 在 Java 12 JDK 的bin文件夾中同時包含 JRE 和 JDK。 (我一直認為 JRE 和 JDK 是不同的應用程序,但事實證明情況發生了變化。)

我的問題是我的計算機上安裝了 Java JDK 12。 同時,我的計算機上安裝了 Java 8 (JRE)。 所以我的電腦變得混亂。

將我的命令提示符環境設置為運行 Java 和 Javac 命令:

我輸入了以下命令:

java -version

這給了我 Java 8。

之后,我輸入:

javac -version

這給了我 Java 12。

換句話說,我的程序正在使用 Java 12 編譯,而我正在嘗試使用 Java 8 運行。

為了解決這個問題,我從我的計算機上卸載了 Java 8 JRE。

我回到命令提示符檢查“java -version”和“javac -version”是否返回相同的版本號,是的,它返回的是 Java 12。

我嘗試再次重新編譯我的程序並運行它。 有效!!

解決方案1:右鍵單擊包含main方法的類。 點擊“運行方式”。 單擊“Java 應用程序”。 鍵盤快捷鍵是: Shift + Alt + XJ (在按住ShiftAlt的同時按X ;然后松開ShiftAlt並按J )。

解決方案2:教授所說,請確保java -versionjavac -version相同。

注意:解決方案 1 是一種快速修復,對我和其他一些人有用。 它可能適合您,也可能不適合您。 我認為解決方案2是解決它的正確方法。

通過以下方式從命令行運行 jar:

C:\folder\where\jar\stored>java -jar JarName.jar

我得到了使問題更清楚的信息:

main/Main 已由 Java 運行時的更新版本編譯

在此處輸入圖像描述

在這種情況下,jar 是使用比 jre 支持的版本更新的版本編譯的。

錯誤:發生 JNI 錯誤,請檢查您的安裝並在 Eclipse 中重試

解決方案:檢查您的包名,因為它可能與 Java 中的包名沖突。 只需更改包名稱即可解決您的問題。 :)

我通過更改我的“編譯器合規性級別”解決了這個問題。 在 Eclipse 中:

菜單窗口首選項Java編譯器

在包名稱的開頭使用“java”時我遇到了類似的問題,例如java.jem.pc

檢查您的控制台輸出,我收到:

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.jem.pc

我在一個項目中遇到了類似的問題,在IntelliJ中具有Maven依賴項。

我解決了將依賴范圍從提供更改為編譯的問題。

智能

Menu → FileProject structureModulesDependencies → *Scope (provide to) → Compile

就我而言,問題是由JDK version引起的。 為了解決這個問題,我建議進入您的POM文件並檢查<jdk.version>1.7</jdk.version>.

然后,通過鍵入: java -version在您的cmd (Windows) 或終端(OS X 或 Linux)中檢查 Java 版本。

將終端/命令提示符中顯示的版本與您的 POM 文件中的版本進行比較。 確保它們相同。 然后再次運行您的項目。

您可以先檢查控制台以查看實際的錯誤消息,然后繼續尋找該錯誤的答案。

我的控制台顯示類jcommander的錯誤 NoClassDefFound 。

您的錯誤可能與我的不同。 我的錯誤的原因是類jcommander不在我的 M2 存儲庫中,所以我只需在我的pom.xml文件中添加該依賴項。 您可以檢查是否所有類依賴項都已聲明並添加到當前配置和項目構建中。

NoClassDefFoundError

我也面臨同樣的問題。 通過查看控制台說

java.lang.SecurityException 問題。

解決方案是:檢查項目的包名稱。

如果 JDK 版本不同,可能會發生這種情況。

Maven試試這個:

<properties>
    <jdk.version>1.8</jdk.version>
</properties>

Buildplugins下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <source>${jdk.version}</source>
        <target>${jdk.version}</target>
    </configuration>

</plugin>

我遇到了同樣的問題,在我的情況下,編譯器合規級別在我的 Eclipse 設置中被選為 14。 為了修復它,我將其更改為我機器上的 JDK 版本,即 1.8 並重新編譯了項目。

在此處輸入圖像描述

檢查您的控制台。 它說 java.lang.SecurityException 問題。 更改您的“包名稱”。 我將包名稱從“java.assessment”更改為“assesment”,它對我有用。 如果有人知道根本原因,請告訴我。

我發現將這些代碼行添加到Maven項目的pom.xml文件可以為我解決類似的問題:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.packagename.MainClassName</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我遇到了類似的問題,然后在包名中得到了解決方案。

我將包名稱保留為java.basics 在控制台中,我得到了一個提示,因為它清楚地表示“禁止的包名稱”。 所以我更改了包名稱並且它起作用了。

可能的解決方案

如果這些解決方案都不適合你,那么試試這個......我終於通過刪除工作區文件夾中的兩個文件夾“.metadata”和“.recommenders”來開始工作了。

您可以通過單擊 Eclipse 應用程序工具欄中的菜單FileSwitch WorkspaceOther來找到您的工作區文件夾路徑。

現在,我是一個徹頭徹尾的菜鳥,正在聖何塞州立大學攻讀軟件工程學位。 所以我只是在不知道確切原因的情況下分享對我有用的東西。

我不知道有什么危害或頭痛,或者即使上述兩個文件夾都需要刪除。 但最后,它對我有用,而且似乎應用程序只是重新創建了這些文件夾的新版本。

我遇到了同樣的問題,但在我的情況下,這是由於 IntelliJ IDEA 中的配置設置造成的。

即使項目 SDK(文件 -> 項目結構)設置為 Java 11,運行/調試配置(運行 -> 編輯配置)中的 JRE 也設置為 Java 8。將其更改為 Java 11 后,它就像一個魅力。

只需檢查小步驟...

javac -version

javac 17

java -version

java version "17" 2021-09-14 LTS

javacjava版本都是一樣的。 如果不同,您將收到此錯誤。

編輯“.classpath”並包含以下標簽:

<classpathentry kind="con" path="org.testng.TESTNG_CONTAINER"/>

這可以解決你的問題。

在我的項目中,我更改了我的 MavenPOM文件並刪除了 maven-jar-plugin 的條目。

當您構建一個目的是可執行的 JAR 文件時,您需要包含它,以便將某些條目寫入清單中。 我打開了舊項目,復制了該條目(對項目名稱進行了一些修改)並且它起作用了。

我認為這是因為您的類的名稱與 JDK 中另一個類的名稱相同。 通過選擇您的類所在的包來幫助Eclipse確定您正在嘗試運行哪一個。轉到運行配置,選擇項目和主類

當您按下搜索按鈕選擇主類時,您會找到名稱相同但包不同的選項,請選擇您的類。

我的問題來自於嘗試從我的項目中禁用 Maven 特性,然后刪除pom.xml文件。 這很糟糕,非常糟糕,不要這樣做。 如果這樣做,請將其更改回 Maven 項目,希望您可以恢復舊的pom.xml文件或創建一個新文件。 一旦我這樣做了,它就再次起作用了。

編輯:我最近再次遇到了這個問題,這次是因為我的類路徑中有重復的庫。 Maven 添加的一個(以 /M2_REPO/.... 開頭,然后是我添加的一個(我不應該這樣做)。即使 Eclipse 報告它找不到類,實際問題是我有給它兩個具有相同類的庫,它不知道要使用哪一個。一旦我刪除了第二個引用,它就起作用了。

我的控制台中沒有任何信息,因此讓我搜索其他解決方案並找到了這些 - 此處提供的解決方案是獨一無二的。 我在Eclipse v4.7 (Oxygen) 嘗試在項目上運行舊的Ant構建時遇到了這個問題。

原因1

我已將 Eclipse 配置為使用版本 1.10.2 的外部 Ant 安裝,其中顯然包含使用 JDK 9 編譯的類。在 Eclipse 中,我得到了上述JNI錯誤(在命令行運行 Ant 構建給了我著名的“不支持的major.minor 版本”錯誤——我在系統上使用的Java 是JDK 8)。

解決方案是回滾到 Ant 的嵌入式 Eclipse 版本 1.10.1。 我通過單獨下載 Ant 1.10.1 並重新配置 Eclipse 以在外部使用新的 1.10.1 來驗證這是正確的解決方案,它仍然有效。

原因2

當您在 Eclipse 的 Preferences 中錯誤地配置了 Ant Runtime 設置時,也會發生這種情況。 根據您運行的 Ant 版本,您需要將tools.jar文件從適當的 JDK 添加到用於 Ant 運行時(主條目)的類路徑中。 更具體地說,如果沒有適當的配置,Eclipse 會在啟動 Ant 目標時抱怨JRE版本低於特定要求的版本。

從本質上講,“正確配置”意味着調整 Eclipse 中的每個配置項以運行 Ant,以便它們一起工作。 這涉及Ant Runtime Home條目(必須指向與您選擇的 JDK 兼容的 Ant 版本——當針對 JDK 9 編譯時,您不能使用 JDK 8 運行 Ant); 在 Ant Runtime 設置中指定屬於要運行 Ant 的 JDK 的tools.jar 最后將構建腳本的 JRE 環境設置為要在外部工具配置中運行 Ant 的 JDK。

所有這三個設置都需要同意以避免上述錯誤。 您還需要考慮javac標記中使用的屬性,以確保您使用的 JDK 能夠按照您的指示執行(即,JDK 7 無法使用源和目標版本 8 編譯代碼)。

而且

如果您真的只是想運行一個 Ant 構建腳本來將代碼編譯到較舊的 JDK(例如,對於 Oxygen,少於 8 個),那么本文有助於獲得針對較舊 JDK 運行 Ant 的訪問權限。 有少數 Eclipse 版本的 Ant 插件替換,說明很簡短,為您的特定 Eclipse 獲取正確的插件版本很重要。

或者更簡單地說,您可以使用這個非常好的解決方案來進行舊版編譯,這不需要替換您的 Eclipse 插件,而是更改構建腳本中的javac標記(同時使用最新的 JDK)。

在我的項目中添加以下Maven依賴項時,我遇到了同樣的錯誤:

<artifactId>aws-encryption-sdk-java</artifactId>

僅當我運行由maven-shade-plugin生成的陰影 JAR 文件時才出現錯誤。 通過使用maven-assembly-plugin生成的 JAR 文件,我能夠克服該錯誤。

一切都不適合我,但是一旦我刪除工作區的“.metadata”和“.recommenders”,刪除“bin”和“setting”文件夾,然后在我重新導入同一個項目后,它就對我有用.

我在 NetBeans 8.0.2 中遇到了同樣的問題。 Clean and Build Project解決了這個問題。

您可以嘗試:右鍵單擊該項目,然后單擊清理。 在此之后運行項目。

這個對我有用。

在一個版本的 JDK 上編寫的程序將不支持另一個版本的 JDK 的JNI平台。

如果我們使用 JDK 10 和 JDK 8 以及為 JDK 10 配置的 Eclipse 和在 JDK 10 上編寫的代碼。現在,我不想使用 JDK 10 並開始使用 JDK 8 作為 jvm 並嘗試運行代碼寫在 JDK 10 上,所以 Eclipse 會拋出 JNI 的錯誤。

所以,要擺脫這個錯誤,請將當前的 JVM 路徑添加到eclipse.ini文件中。 在此之后,將編寫的代碼復制到剪貼板。 在Eclipse中刪除項目,新建項目,簽入復制的代碼,運行。

如果在啟動Ant時出現問題,請檢查您的 Ant 主目錄:它必須指向您正在運行的同一個 Eclipse 文件夾。

當我重新安裝一個新的 Eclipse 版本並刪除以前的 Eclipse 文件夾同時保留以前的 Ant 主頁時,它發生在我身上:Ant 根本沒有找到任何 Java 庫。

在這種情況下,原因不是 JDK 版本不好。

由於打包名稱為“Java”,我遇到了同樣的問題。 重命名包后,它不再拋出錯誤。

就我而言,Eclipse 給了我這個錯誤,但是我在日志中的javax.servlet.http.HttpServlet上得到了classnotfoundexception

就我而言,我試圖在我的build.gradle文件中使用exclude module: 'spring-boot-starter-tomcat'啟動一個Spring Boot應用程序(因為我在WildFly上進行部署)。

解決方案是將此排除注釋掉。 Eclipse JNI錯誤非常具有誤導性,我建議修復此問題。

我遇到過同樣的問題。 我導入了一個較新版本的 JSON 庫(我刪除了舊版本,但我沒有從構建路徑中刪除它)。

我通過從構建路徑中刪除對舊的引用來解決它。

使用Gradle ,以下內容也對我有用:

包資源管理器→ 右鍵單擊​​項目 → Gradle刷新 Gradle Project

當我們在運行 Java 應用程序時遇到此錯誤時,請檢查我們是否有一些以“java.”開頭的類名或包名。 如果是這樣,請更改包名稱。

發生這種情況是因為您的包名與 Java 系統文件名沖突。

錯誤/問題:

嘗試將我的應用程序作為 Java 應用程序或Spring Boot應用程序運行時,出現以下錯誤

發生 JNI 錯誤,請檢查您的安裝並重試。 發生Java異常。

以及在控制台中收到此錯誤:

線程“主”java.lang.UnsupportedClassVersionError 中的異常:com/example/demo/IocApplication 已由 Java 運行時的更新版本(類文件版本 55.0)編譯。 此版本的 Java 運行時僅識別最高 52.0 的類文件版本

根本原因是什么?

這個錯誤的原因是

  • 代碼正在更高版本上編譯。 就我而言,它是第 11 版......
  • 該代碼正在較低版本上執行。 就我而言,它是第 8 版。
  • 即,Java(JDK)在 11 上編譯代碼,而 JRE 版本是 8。

我在哪里配置了 JDK 11 和 JRE 8?

  • 我正在使用 SpringToolSuite (STS)。 當我創建項目時,JRE System 庫位於構建路徑中,它被添加為默認的 JRE 庫版本 8 (1.8)。 但是當我轉到項目 →屬性Java 編譯器編譯器合規級別時,默認情況下選擇的版本為 11

解決方案:

項目 →屬性Java 編譯器編譯器合規級別

  • Compiler Compliance Level設置為 1.8 就是這樣。 現在您正在 1.8 中編譯代碼並使用 JRE 1.8 執行編譯后的代碼。

接受的答案沒有解決問題,因此我發布了對我有用的內容。

這是一個核心問題。 嘗試javac --versionjava --version 您將看到不匹配或不一致的情況。 嘗試正確設置路徑變量,您不會看到任何錯誤。

對於 Eclipse,右鍵單擊項目 →屬性 然后轉到項目方面並將 JDK 設置為所需的版本。 然后轉到運行時並將 JRE 設置為相同的版本。 你應該很好。

我試圖運行我的 JAR 文件(沒有外部 JAR 文件)在運行時添加庫java -cp "..." -jar myCode.jar ,但是當您指定-jar時, -cp參數將被忽略

所以你可以在類路徑中包含你的 JAR 文件,然后調用你的主類:

java -cp "myCode.jar:/path/to/jars/*" foo.bar.MyMainClass

從命令行運行 JAR 文件並指定類路徑

在 Eclipse 中運行 Java 和JavaFX應用程序時,我遇到了同樣的問題。 但我有一個簡單的解決方案。 我已從構建路徑中刪除了 JDK 1.8,並將相同的 JDK 1.8 添加到了構建路徑中。 現在可以了。

當我從 Git 存儲庫簽出項目時,我遇到了同樣的問題。

為了解決這個問題,我在pom.xml文件中添加了這些屬性,以告知要使用哪個 Java 版本(我們使用的是 Java 1.8,但您可以根據需要使用任何版本號)。

<properties>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

出現這個問題的原因可能是JDK版本不一致,JAR包會有簽名文件,不影響程序邏輯,但會導致測試demo失敗。 因此,需要刪除JAR包中的簽名相關文件。

刪除生成的 JAR 文件中 meta-inf 下的 .DSA 和 .SF 文件。

NetBeans 8.0.2 中:

  1. 右鍵單擊您的包。
  2. 選擇“屬性”。
  3. 轉到“運行”選項。
  4. 通過瀏覽您的班級名稱來選擇主要班級。
  5. 單擊確定按鈕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM