我有一个定制的JNI库,我已经在我的Ubuntu 20.04机器上编译过了,我们称之为JNI.so。我还部署了两个不同的SpringBoot Web应用程序到Tomcat9服务器上,这两个应用程序都需要访问这个库文件。按照这里的说明,我尝试将JniLifecycleListener添加到我的服务器。xml配置文件以及以编程方式调用org.apache.tomcat.jni.Library.loadLibrary。虽然我的目标是让两个Web应用程序访问这个本机库,但为了简单地调试这个问题,我将自己限制为只有一个Web应用,直到我启动并运行为止。下面是我的java类的样子:
package com.example.hellojni;
public class HelloJni {
public native String stringFromJNI();
public String test() {
return stringFromJNI();
}
}
下面是 C 代码:
#include <string.h>
#include <jni.h>
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
使用以下内容编译:
gcc -c -fPIC hello-jni.c -o hello-jni.o -I/usr/lib/jvm/java-8-openjdk-amd64/include/ -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux
gcc hello-jni.o -shared -o libJNI.so
我还将我的JNI.so文件放在$CATALINA_HOME/share/lib中,并将以下内容添加到我的catalina.properties文件中(如下所述):
shared.loader="${catalina.base}/shared/lib", "${catalina.base}/shared/lib/*.jar"
使用服务器中的JniLifecycleListener行。xml文件,当tomcat启动时,我看到以下日志数据:
17-Jun-2020 15:32:06.266 INFO[main]org.apache.catalina.startup.Catalina.load服务器初始化在[705]毫秒内完成
17-Jun-2020 15:32:06.267 INFO[main]org.apache.catalina.core.JniLifecycleListener.lifecycleEvent加载的原生库[JNI]
2020年6月17日15:32:06.329 INFO[main]org.apache.catalina.core.StandardService。startInternal启动服务[Catalina]
17-Jun-2020 15:32:06.331 INFO[main]org . Apache . catalina . core . standard engine . start内部启动Servlet引擎:[Apache T
但是,当我尝试使用以下代码从Spring启动控制器中访问库时:
System.out.println(new HelloJni().test());
我收到以下错误:
java.lang.UnsatisfiedLinkError: com.example.hellojni.HelloJni.stringFromJNI()Ljava/lang/String;
at com.example.hellojni.HelloJni.stringFromJNI(Native Method) ~[classes/:0.0.1-SNAPSHOT]
at com.example.hellojni.HelloJni.test(HelloJni.java:9) ~[classes/:0.0.1-SNAPSHOT]
at com.company.MyApplication.controllers.DashboardController.dashboard(DashboardController.java:51) ~[classes/:0.0.1-SNAPSHOT]
现在,我觉得我已经尝试了我能在网上找到的所有解决方案,结果都差不多。我尝试完全放弃使用JniLifecycleListener,转而使用这个流行的解决方案,这个解决方案似乎早于Tomcat 7,但结果完全相同。我试着定位。所以将文件放在$CATALINA_HOME/lib中,而不是shared/lib,结果类似。
我能够取得任何进展的唯一方法是放弃JniLifecycleListener,在一个JAR中的静态代码块中调用plain System.loadLibrary(),我已经将这个JAR打包并放入shared/lib中。所以文件,然后调用本机方法调用。然而,这只适用于静态方法或加载库的静态代码段。我想至少它证实了我的JNI库是正确编写的。
任何人都可以帮我,我觉得我快要疯了!
在使用ODA Java SDK时,我遇到了完全相同的问题。当tomcat启动时,dll文件确实是使用JNILifeCirclelistener加载的(如日志所示),但实际函数被调用时,它总是会引发以下错误:
java.lang.UnsatisfiedLinkError: com.opendesign.core.GlobalsJNI.swig_module_init()V
只要我删除了 JNI 生命循环程序并使用系统.load库 ()
,该 dll 就可以与 JNI 一起工作。我的 JVM、dll 和雄猫都是 64 位的。
非常奇怪的行为,我不知道有什么办法可以解决。
您的函数在库中不可见。javac -h
为您创建的头文件为所有本机函数声明了 JNIEXPORT
,对于 GNU 编译器,这些函数已扩展到可见性(“默认”)
。但是您没有包含该标头,因此链接器不会导出该函数(因此您的Java进程找不到它)。
我正在尝试让一个简单的HTTP控制台应用程序作为Azure服务应用程序运行。它所做的只是在连接时返回OK。它在我的笔记本电脑上运行良好,我可以使用VS2019发布到Azure ok。问题是用于监听的前缀。 在我的笔记本电脑上,我可以使用超文本传输协议://: 80/; https://: 443/,但在Azure中,我得到一个错误:[例外]访问被拒绝。 本文https://github.com/p
我刚从下载了Tess4Jhttp://tess4j.sourceforge.net/并将其导入到netbeans中。我遵循这个url,我正确地遵循了每一步,但当我尝试执行时,我得到了下面的错误。 错误: 我搜索并发现人们建议更新到 Visual Visual Studio 2013 的可再发行组件包,我做了,但事实证明没有帮助,我仍然遇到同样的问题。我不知道我做错了什么,下面是我的代码。 代码:
我正在尝试运行下面的Java 3D示例代码。我指的是3个罐子和1个dll文件夹。他们的名字如下 维玛特.jar j3d-core-1.3.1.jar j3dutils.jar j3dcore-ogl.dll(我也尝试过引用一个 jar 文件而不是这个 dll 文件。jar 文件是 j3dcore-d3d_dll.jar)。 我还尝试将它们放在jdk和jre的bin和lib文件夹中。 我还在名为“P
问题内容: 我想创建一个简单的JNI层。我使用Visual Studio 2008创建了一个dll(带有DLL作为选项的Win 32 Console Application项目类型)。我在调用本地方法时收到此异常: 生成的头文件是: 实现文件是: Java文件是: 当我调用本地方法“ Hello”时,我得到执行。 我观察到的另一件事是,当我使用以下命令在命令行中进行编译时:“ cl -I” C:\
我正在尝试启动我的Spring boot web应用程序,它链接到MySQL数据库。该应用程序是在docker容器上启动的,该容器与MySQL数据库容器处于同一网络中。我曾经尝试使用容器名称作为MySQL的主机,但是它导致了名称解析,所以我现在使用docker容器的私有IP地址来连接。 我收到一个错误:
问题内容: 我尝试做同样的事情,但没有成功。重新启动服务器后,API的前x次可以在基本身份验证下正常运行,但是几次后,我被重定向到登录(表单)页面,这仅应在我们的Web应用程序上发生,而不是在API调用上发生。 我的代码: 任何的想法? 我正在使用Spring Boot版本1.4.1-RELEASE和Spring Security版本4.1.3-RELEASE。 问题答案: 两种配置都使用相同的配