-
java调用Linux环境下jni的问题5
我在tomcat启动时就执行这个native 方法,可是执行的结果却不对。
我改成main() 用 java com.xxx.xx.Abc 这样就可以执行,这是为什么啊????
有没有高手回答一下呀
public class License { /** * 注释内容 */ private static final long serialVersionUID = 1L; /** * 日志对象 */ static { int i = 0; try { System.out.println("loadLibary start..."); System.loadLibrary("License"); i = 1; System.out.println("load Libary OK..."); } catch (Exception e) { i = 2; // TODO Auto-generated catch block System.out.println("load error"); e.printStackTrace(); Runtime runtime = Runtime.getRuntime(); try { i = 3; System.out.println("load libLicense.so error, killall java"); runtime.exec("killall java"); } catch (Exception e1) { i = 4; // TODO Auto-generated catch block e1.printStackTrace(); } } finally { System.out.println("i = " + i); if (i == 0) { Runtime runtime = Runtime.getRuntime(); try { System.out.println("load libLicense.so error, killall java"); runtime.exec("killall java"); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } } private native boolean verifylicense(); /** * <校验license> * <功能详细描述> * @param args * @see [类、类#方法、类#成员] */ public static void main(String[] args) { System.out.println("into init() method.."); License l =new License(); Object o = l.verifylicense(); System.out.println("return value is: " + o.toString()); if (l.verifylicense()) { System.out.println("verifylicense ERROR"); Runtime runtime = Runtime.getRuntime(); try { System.out.println("verifylicense failed, killall java"); runtime.exec("killall java"); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } else { System.out.println("verifylicense OK"); } System.out.println("after verifylicense~~~~"); } }
换成随着tomcat启动时执行,verifylicense()却始终返回true,貌似没有执行
问题补充:改成如下的方式:随着tomcat启动时执行,native方法执行不了,这是为什么啊?
<servlet>
<servlet-name>smcInitServlet</servlet-name>
<servlet-class>com.xxx.common.util.License</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
public class License extends HttpServlet
{
private native boolean verifylicense();
static{
System.loadLibrary("License");
}
public void init(ServletConfig servletConfig)
throws ServletException
{
logger.error("into init() method..");
Object o = verifylicense();
System.out.println("return value is: " + o.toString());
logger.error("return value is: " + o.toString());
if (verifylicense())
{
System.out.println("verifylicense ERROR");
logger.error("verifylicense ERROR");
Runtime runtime = Runtime.getRuntime();
try
{
System.out.println("verifylicense failed, killall java");
logger.error("verifylicense failed, killall java");
runtime.exec("killall java");
}
catch (Exception e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
else
{
System.out.println("verifylicense OK");
logger.error("verifylicense OK");
}
logger.error("after verify_license~~~~");
}
}
问题补充:把有main的License.java换成一个Thread,在tomcat启动时去创建这个Thread并执行,native方法貌似一直返回的是true,这是为什么呀?2013年7月09日 18:29
目前还没有答案
相关推荐
1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一个桥梁,可以调用本地代码(如C++),反之亦然。这使得开发者可以在必要时利用C++的性能优势或者调用系统级API。 - Java程序通过`System.loadLibrary`或...
### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...
通过以上步骤,我们完成了在Linux环境下使用C语言通过JNI调用Java类的全过程。这种技术广泛应用于高性能计算、系统集成、设备驱动等多个场景,是Java和C/C++混合编程的关键技术。在实际应用中,可能还需要处理更复杂...
在提供的资源"使用C++创建java虚拟机JVM,使用JNI调用java函数"中,可能详细介绍了以上步骤的实际应用,包括代码示例和可能遇到的问题及解决方案。通过学习和实践这个教程,开发者可以更好地理解和掌握C++与Java之间...
通过JNI,开发者可以在Java应用中嵌入C/C++代码,解决Java在某些场景下性能不足的问题,或者利用现有的本地库资源。 2. **在Java RCP中使用JNI的动机** - **性能优化**:对于需要高性能计算或者图形处理的任务,...
总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...
Java在Linux环境中调用SAP RFC接口涉及到的关键技术点包括Java与SAP的集成、Linux系统下的动态链接库(.so文件)以及SAP的RFC(远程功能调用)技术。这里将详细介绍这些知识点。 首先,SAP RFC是SAP提供的一种通信...
在 Linux 环境下编译 C++ 代码需要安装 GCC 编译器,并使用 `g++` 命令编译 C++ 代码。 6. 如何在 Java 代码中加载 DLL 文件? 在 Java 代码中加载 DLL 文件需要使用 `System.load()` 方法或 `System.loadLibrary()`...
- Sample1.cpp和Sample1.h构成了C/C++端的实现,它们将被编译成动态链接库供Java调用。 通过以上步骤,我们可以看到,JNI允许Java和C/C++代码无缝集成,实现了跨语言的混合编程。这不仅扩展了Java的功能,还能利用...
Java使用JNI(Java Native Interface)调用C++ DLL库是一种常见的技术,特别是在需要利用Java的跨平台特性同时利用C++的高效性能时。JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接...
标题中的“JNI实现的DEMO Java调用VC编写的DLL,对应于Linux .SO”指的是一个使用Java Native Interface (JNI) 技术的示例,该示例展示了如何在Java程序中调用由Visual C++ (VC) 编译生成的动态链接库(DLL) 文件,...
Java的JNI(Java Native Interface)本地调用是一个关键的技术,它允许Java代码直接调用C/C++编写的原生库,极大地扩展了Java应用程序的功能。在这个简单实例中,我们将探讨如何实现这一过程,同时注意到由于Java和...
在Java编程环境中,有时我们需要利用C++编写的高性能或特定功能的库,这时可以借助Java的JNI(Java Native Interface)技术来调用C++编写的动态链接库(DLL)。本教程将详细介绍如何在Java中调用C++动态库,并通过...
在Linux环境下,Java开发者经常需要处理与GDAL(Geospatial Data Abstraction Library)相关的项目。GDAL是一个开源的地理空间数据处理库,它提供了多种数据格式的读写能力,并支持空间几何操作和坐标系统转换。这个...
需要注意的是,使用JNI时,必须小心处理内存管理和线程安全问题,因为C和Java在这些方面有不同的处理方式。此外,每次Java方法调用都需要通过JNI接口,这可能会带来一定的性能开销,因此,只有在必要时才应使用JNI。
本笔记主要探讨如何通过JNI实现Java方法与本地(Native)方法的相互调用。 首先,理解JNI的基本结构是至关重要的。JNI接口定义了一组函数,Java代码可以通过这些函数调用本地方法,反之,本地方法也可以通过这些...
这个"linux-java调用c语言编译的so动态库-jni例子-简单计算器"是一个典型的示例,展示了如何利用JNI来创建一个Java应用程序,该程序能够调用C编写的动态链接库(.so文件)进行计算操作。 JNI是Java平台的一部分,它...
Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。...通过学习这些实例,开发者可以进一步提升在Java中使用JNI的能力,解决特定问题并提升程序性能。