无法初始化类 com.sun.jna.Native

Posted

技术标签:

【中文标题】无法初始化类 com.sun.jna.Native【英文标题】:Could not initialize class com.sun.jna.Native 【发布时间】:2012-08-01 03:13:42 【问题描述】:

我试图使用 JNA 在 linux 服务器上更改以编程方式上传文件的文件权限。我的参考是this 和this。我的代码如下。我得到了一个Operation not permitted 异常。有没有办法解决这个问题?有没有其他方法可以编程更改上传文件的权限?或者有什么方法可以上传具有指定文件权限的文件。我正在使用java 1.5。我已将 jna.jar 放入 /public_html/WEB-INF/lib,有人可以为初学者推荐一个好的 JNA 教程吗?

JSP 代码(用于测试)

<%@page import="cc.FileModifierLinux"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%

try



    FileModifierLinux flx=new FileModifierLinux();
    String pathX = getServletContext().getRealPath("/testpage.jsp");
    flx.Update(pathX);
    out.println("No Exception");

catch(Exception exp)

    out.println("exp :"+exp);

%>
</body>
</html>

使用的类

package cc;
import com.sun.jna.Library;
import com.sun.jna.Native;

public class FileModifierLinux 
     CLibrary libc = (CLibrary) Native.loadLibrary("c", CLibrary.class);
    public void Update(String pth) 
        libc.chmod(pth, 0755);
    


interface CLibrary extends Library 
    public int chmod(String path, int mode);

异常

有关完整的异常详细信息,请参阅this

 org.apache.jasper.JasperException: Exception in JSP: /index_check.jsp:23

20: 
21:     
22:     
23:     FileModifierLinux flx=new FileModifierLinux();
24:     String pathX = getServletContext().getRealPath("/testpage.jsp");
25:     flx.Update(pathX);
26:     out.println("No Exception");


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:491)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:395)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

root cause

javax.servlet.ServletException: Could not initialize class com.sun.jna.Native

【问题讨论】:

【参考方案1】:

我也有类似的问题;对我来说,从 JNA 3.0.9 升级到 3.2.7 解决了这个问题。我还添加了我之前缺少的platform.jar。

【讨论】:

谢谢解答,我也试试【参考方案2】:

您可能需要在您的服务器上安装 libjnidispatch.so,以便它在 java.library.path 中可用,以便 JNA 可以加载它。抛出的异常是由于 JNA 没有找到该库并试图从其自己的 jar 文件中解压缩它。

根据最初的例外情况,您的 servlet 将不被允许加载本地库,除非来自指定的受保护位置。查看您的 servlet 容器文档,了解如何安装并使其可用于加载 JNI 库。

【讨论】:

以上是关于无法初始化类 com.sun.jna.Native的主要内容,如果未能解决你的问题,请参考以下文章

jna 平台中的 NoSuchMethodError

无法初始化类

为啥无法初始化应用委托类?

无法初始化类对象:Objective-C

“NoClassDefFoundError:无法初始化类”错误

排毒 - 无法初始化类 DefaultKotlinSourceSetKt