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

JNLP小程序未满足链接错误

司马庆
2023-03-14

我正在尝试使用JNLP构建一个小程序。我编写了一个Ant脚本来编译java类、构建jar文件并对它们进行签名。我使用与Ant构建的相同的密钥库对所有jar进行了签名。我在Java控制面板中授予了显示自签名小程序的权限。如果我直接运行JNLP文件,一切都很好,但是如果我将此小程序放在网页中,我会得到不满意的LinkError。

这是我得到的错误:

java.lang.reflect.InvocationTargetException
    at java.awt.EventQueue.invokeAndWait(Unknown Source)
    at java.awt.EventQueue.invokeAndWait(Unknown Source)
    at javax.swing.SwingUtilities.invokeAndWait(Unknown Source)
    at polygon.Example.init(Unknown Source)
    at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.init(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.UnsatisfiedLinkError: no gluegen-rt in java.library.path
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at com.jogamp.common.jvm.JNILibLoaderBase.loadLibraryInternal(JNILibLoaderBase.java:454)
    at com.jogamp.common.jvm.JNILibLoaderBase.access$000(JNILibLoaderBase.java:59)
    at com.jogamp.common.jvm.JNILibLoaderBase$DefaultAction.loadLibrary(JNILibLoaderBase.java:90)
    at com.jogamp.common.jvm.JNILibLoaderBase.loadLibrary(JNILibLoaderBase.java:328)
    at com.jogamp.common.os.DynamicLibraryBundle$GlueJNILibLoader.loadLibrary(DynamicLibraryBundle.java:390)
    at com.jogamp.common.os.Platform$2.run(Platform.java:249)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.jogamp.common.os.Platform.loadGlueGenRTImpl(Platform.java:231)
    at com.jogamp.common.os.Platform.<clinit>(Platform.java:183)
    at javax.media.opengl.GLProfile.<clinit>(GLProfile.java:99)
    ...

我根据操作系统构建的每个jar文件都包含gluegen-rt.dll但无法加载。我本地库的Jar文件由DLL文件组成。它看起来像:

  • win64。罐子
    • gluegen-rt.dll
    • jogl\U cl.dll

    我的文件夹层次结构如下所示:

    • 网络内容

    这是我的Ant脚本:

    <project name="Project" default="signJar">
    <path id="libraries.path">
        <fileset dir="${lib.dir}" includes="**/*.jar"/>
    </path>
    
    <path id="maps.path">
        <fileset dir="${maps.dir}"/>
    </path>
    
    <target name="clean">
        <delete dir="${classes.dir}" />
        <delete dir="${jar.dir}" />
        <delete dir="${build.dir}" />
    </target>
    
    <target name="init" depends="clean">
        <mkdir dir="${build.dir}" />
        <mkdir dir="${classes.dir}" />
        <mkdir dir="${dist.dir}" />
    </target>
    
    <target name="compile" depends="init">
        <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="true" verbose="true" classpathref="libraries.path" encoding="ISO-8859-9" />
    </target>
    
    <target name="dist" depends="compile">
    
        <pathconvert property="mf.classpath" pathsep=" ">
            <path refid="libraries.path" />
            <flattenmapper />
        </pathconvert>
    
        <tstamp/><!-- needed for TODAY -->
        <manifest file="MANIFEST.MF">
            <attribute name="Built-By" value="${manifest.built.by}"/>
            <attribute name="Created-By" value="${manifest.created.by}"/>
            <attribute name="Main-Class" value="polygon.MainApplet"/>
            <attribute name="Implementation-Version" value="${version.number}-b${build.number}"/>   
            <attribute name="Built-Date" value="${TODAY}" />
            <attribute name="Class-Path" value="${maps.dir} ${mf.classpath}" />
            <attribute name="Permissions" value="all-permissions" />
            <attribute name="Codebase" value="*" />
            <attribute name="Application-Name" value="Applet Application in Manifest" />
            <attribute name="Trusted-Only" value="true" />
        </manifest>
    
        <jar jarfile="${dist.dir}/applet.jar" basedir="${classes.dir}" manifest="MANIFEST.MF" />
    
        <jar jarfile="${dist.dir}/${native.libraries.dir}/linux.jar" basedir="${native.libraries.dir}/linux" />
        <jar jarfile="${dist.dir}/${native.libraries.dir}/linux64.jar" basedir="${native.libraries.dir}/linux64" />
        <jar jarfile="${dist.dir}/${native.libraries.dir}/macos_64.jar" basedir="${native.libraries.dir}/macos_64" />
        <jar jarfile="${dist.dir}/${native.libraries.dir}/macos_ppc.jar" basedir="${native.libraries.dir}/macos_ppc" />
        <jar jarfile="${dist.dir}/${native.libraries.dir}/macos_x86.jar" basedir="${native.libraries.dir}/macos_x86" />
        <jar jarfile="${dist.dir}/${native.libraries.dir}/solaris_amd64.jar" basedir="${native.libraries.dir}/solaris_amd64" />
        <jar jarfile="${dist.dir}/${native.libraries.dir}/solaris_i586.jar" basedir="${native.libraries.dir}/solaris_i586" />
        <jar jarfile="${dist.dir}/${native.libraries.dir}/solaris_sparc.jar" basedir="${native.libraries.dir}/solaris_sparc" />
        <jar jarfile="${dist.dir}/${native.libraries.dir}/solaris_sparc64.jar" basedir="${native.libraries.dir}/solaris_sparc64" />
        <jar jarfile="${dist.dir}/${native.libraries.dir}/win32.jar" basedir="${native.libraries.dir}/win32" />
        <jar jarfile="${dist.dir}/${native.libraries.dir}/win64.jar" basedir="${native.libraries.dir}/win64" />
    
        <jar jarfile="${dist.dir}/maps.jar" basedir="${lib.dir}/maps" />
    
        <copy todir="${dist.dir}">
            <fileset dir="${lib.dir}">
                <include name="*.jar"/>
            </fileset>
        </copy>
    
    </target>
    
    <target name="signJar" depends="dist">
        <delete dir="${dist.dir}/.keystore" />
    
        <genkey alias="keystorealias" verbose="true" storepass="storepass" 
                keypass="keypass"
                validity="365"
                keystore="${dist.dir}/.keystore">
                <dname>
                    <param name="CN" value="CN"/>
                    <param name="OU" value="OU"/>
                    <param name="O"  value="O"/>
                    <param name="C"  value="TR"/>
                </dname>
            </genkey>
    
            <signjar
                alias="keystorealias" keystore="${dist.dir}/.keystore"
                storepass="storepass"
                keypass="keypass">
              <path>
                <fileset dir="${dist.dir}" includes="**/*.jar" />
              </path>
            </signjar>
        </target>
    </project>
    

    我没有写我的属性。我需要一些本机库来运行应用程序,正如您在Ant脚本中看到的那样,我根据操作系统将它们放入jar中。我还需要lib文件夹中的一些其他jar文件,但我将它们放入Manifest文件中。我没有将它们写在JNLP文件中。

    这是我的JNLP:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <jnlp spec="1.0+">
        <information>
            <title>Demo</title>
            <vendor>Team</vendor>
            <offline-allowed />
        </information>
        <security>
            <all-permissions/>
        </security>
        <resources>
            <j2se version="1.7+" initial-heap-size="256M" max-heap-size="512M" />
    
            <jar href="applet/applet.jar" main="true" />
            <jar href="applet/maps.jar" />
        </resources>
    
        <resources os="Linux" arch="x86">
            <nativelib href="applet/lib/native/linux_x86.jar" />
        </resources>
    
        <resources os="Linux" arch="amd64">
            <nativelib href="applet/lib/native/linux_x64.jar" />
        </resources>
    
        <resources os="Windows" arch="x86">
            <nativelib href="applet/lib/native/win32.jar" />
        </resources>
    
        <resources os="Windows" arch="amd64">
            <nativelib href="applet/lib/native/win64.jar" />
        </resources>
    
        <applet-desc name="Applet Application in Applet" main-class="polygon.Example" width="800" height="600" />
        <update check="background" policy="prompt-update" />
    </jnlp>sources>
    
        <resources os="Linux" arch="x86">
            <nativelib href="applet/lib/native/linux_x86.jar" />
        </resources>
    
        <resources os="Linux" arch="amd64">
            <nativelib href="applet/lib/native/linux_x64.jar" />
        </resources>
    
        <resources os="Windows" arch="x86">
            <nativelib href="applet/lib/native/win32.jar" />
        </resources>
    
        <resources os="Windows" arch="amd64">
            <nativelib href="applet/lib/native/win64.jar" />
        </resources>
    
        <applet-desc name="Applet Application" main-class="polygon.Example" width="800" height="600" />
        <update check="background" policy="prompt-update" />
    </jnlp>
    

    这里还有我在网页中添加小程序的超文本标记语言代码:

    <applet width="800" height="500" codebase="applet" code="polygon.Example" archive="applet.jar">
    <param name="jnlp_ref" value="applet.jnlp" />
    </applet>
    

    我尝试使用File类在我的小程序中访问gluegen-rt.dll,我可以访问它。为什么我的小程序可以加载本地库,如果我直接运行JNLP,为什么如果我把它放在网页中,它不能加载它们?

    请注意,我不想将上面提到的库添加到我的计算机的classpath中,因为如果其他用户不添加,则无法运行它。因此,不可能在所有用户的计算机中将其添加到类路径中。这对我的情况来说不是一个好的解决方案。

共有1个答案

姚培
2023-03-14

我发现这是因为小程序必须用不同的标记而不是小程序标记来添加。在我的情况下,我应该将applet标记更改为以下行以添加applet。

<script src="http://www.java.com/js/deployJava.js"></script>
<script>
    var attributes = {code: 'polygon.Example', width: 800, height: 600};
    var params = {jnlp_href: 'applet.jnlp'};
    deployJava.runApplet( attributes, params, '1.7' );
</script>
 类似资料:
  • 为什么我会得到不满意的链接错误? 细节如下: 本机方法的原型及其在我的Java代码中的调用是这样的: 私有本机long sampleFunction(long[][]twoDimArray,long number); p.SampleFunction(twoDimArray,number); 本机方法在VC++代码中的原型是这样的: JNIEXPORT jlong JNICALL Java_MyC

  • 我是一名学生,正在为我的学校项目开发OCR功能。到目前为止,我能够成功地实现这些功能并运行应用程序。 我在Android Studio1.5.1上有我的应用程序,并且能够在我的旧设备三星银河笔记3应用编程接口21上运行它。最近,我将我的设备更改为三星银河笔记5应用编程接口22,每当我试图运行光学字符识别功能时,应用程序就会崩溃。 以下是日志: 致命异常:java。lang.IllegalState

  • 我有一个JNI dll以及我在带有eclipse的机器上创建的jar文件。 我正在尝试将其部署到另一台机器,但无法通过异常 我有另一个打印java.library.path的程序,我已经验证了这个dll所依赖的dll以及这个dll在java.library.path. 我已经阅读了他们应该在当前目录中的帖子,但这不起作用。 我读过他们应该去jre/bin的帖子,得到了同样的结果。 任何帮助都将不胜

  • 嘿,我正在尝试使用tess4j为tesseract,并在mac osx上为eclipse解决这个问题。 我的tesseract在终端上运行良好,但是试图通过tesseract运行tess4j会给我带来一个错误。

  • 我正在使用Sikuli脚本运行Testng,它在Eclipse ide中运行良好。在Eclipse IDE中,我使用Java1.7.0版本。 但是当我创建一个Ant脚本时,它抛出了一个异常。当我与ant-v核实时 Apache Ant version 1.7.1编译于2010年9月8日Buildfile:build.xml检测到Java版本: 1.6--- 初始化:[echo]开始。时间 构建:

  • 我试图编写一个简单的Java程序,通过JNI调用C函数来打印“Hello World”。一切编译都没有错误,但当我运行程序时,我得到一个“UnsatisfiedLinkError:找不到依赖库”。 根据Dependency Walker和dumpbin的说法,唯一的依赖项是“kernel32.dll”,在C:\Windows\System32及其依赖项中,也在System32中。 使命感 返回时没