0 0

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
目前还没有答案

相关推荐

    在windows中jni(生成dll)Linux中jni(生成so),java调用曾c++

    1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一个桥梁,可以调用本地代码(如C++),反之亦然。这使得开发者可以在必要时利用C++的性能优势或者调用系统级API。 - Java程序通过`System.loadLibrary`或...

    Java JNI调用动态库(Linux、Windows)的实现步骤

    ### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...

    linux C JNI调用java

    通过以上步骤,我们完成了在Linux环境下使用C语言通过JNI调用Java类的全过程。这种技术广泛应用于高性能计算、系统集成、设备驱动等多个场景,是Java和C/C++混合编程的关键技术。在实际应用中,可能还需要处理更复杂...

    使用C++创建java虚拟机JVM,使用JNI调用java函数.zip

    在提供的资源"使用C++创建java虚拟机JVM,使用JNI调用java函数"中,可能详细介绍了以上步骤的实际应用,包括代码示例和可能遇到的问题及解决方案。通过学习和实践这个教程,开发者可以更好地理解和掌握C++与Java之间...

    java中RCP中使用JNI

    通过JNI,开发者可以在Java应用中嵌入C/C++代码,解决Java在某些场景下性能不足的问题,或者利用现有的本地库资源。 2. **在Java RCP中使用JNI的动机** - **性能优化**:对于需要高性能计算或者图形处理的任务,...

    C++库封装JNI接口-实现java调用c++

    总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...

    java在Linux下调用sap的RFC接口必备so文件 libsapjco3.so

    Java在Linux环境中调用SAP RFC接口涉及到的关键技术点包括Java与SAP的集成、Linux系统下的动态链接库(.so文件)以及SAP的RFC(远程功能调用)技术。这里将详细介绍这些知识点。 首先,SAP RFC是SAP提供的一种通信...

    Java通过JNI调用C++的DLL文件.docx

    在 Linux 环境下编译 C++ 代码需要安装 GCC 编译器,并使用 `g++` 命令编译 C++ 代码。 6. 如何在 Java 代码中加载 DLL 文件? 在 Java 代码中加载 DLL 文件需要使用 `System.load()` 方法或 `System.loadLibrary()`...

    使用JNI进行混合编程:在Java中调用C/C++本地库

    - Sample1.cpp和Sample1.h构成了C/C++端的实现,它们将被编译成动态链接库供Java调用。 通过以上步骤,我们可以看到,JNI允许Java和C/C++代码无缝集成,实现了跨语言的混合编程。这不仅扩展了Java的功能,还能利用...

    java使用JNI调用C++ dll库用法概述

    Java使用JNI(Java Native Interface)调用C++ DLL库是一种常见的技术,特别是在需要利用Java的跨平台特性同时利用C++的高效性能时。JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接...

    JNI实现的DEMO Java调用VC编写的DLL,对应于Linux .SO

    标题中的“JNI实现的DEMO Java调用VC编写的DLL,对应于Linux .SO”指的是一个使用Java Native Interface (JNI) 技术的示例,该示例展示了如何在Java程序中调用由Visual C++ (VC) 编译生成的动态链接库(DLL) 文件,...

    java 的jni本地调用简单实例

    Java的JNI(Java Native Interface)本地调用是一个关键的技术,它允许Java代码直接调用C/C++编写的原生库,极大地扩展了Java应用程序的功能。在这个简单实例中,我们将探讨如何实现这一过程,同时注意到由于Java和...

    java调用C++编写的动态库dll

    在Java编程环境中,有时我们需要利用C++编写的高性能或特定功能的库,这时可以借助Java的JNI(Java Native Interface)技术来调用C++编写的动态链接库(DLL)。本教程将详细介绍如何在Java中调用C++动态库,并通过...

    linux下java环境gdal编译好的文件

    在Linux环境下,Java开发者经常需要处理与GDAL(Geospatial Data Abstraction Library)相关的项目。GDAL是一个开源的地理空间数据处理库,它提供了多种数据格式的读写能力,并支持空间几何操作和坐标系统转换。这个...

    JNI中C调用Java方法的实例

    需要注意的是,使用JNI时,必须小心处理内存管理和线程安全问题,因为C和Java在这些方面有不同的处理方式。此外,每次Java方法调用都需要通过JNI接口,这可能会带来一定的性能开销,因此,只有在必要时才应使用JNI。

    JNI与Java方法的相互调用

    本笔记主要探讨如何通过JNI实现Java方法与本地(Native)方法的相互调用。 首先,理解JNI的基本结构是至关重要的。JNI接口定义了一组函数,Java代码可以通过这些函数调用本地方法,反之,本地方法也可以通过这些...

    linux-java调用c语言编译的so动态库-jni例子-简单计算器

    这个"linux-java调用c语言编译的so动态库-jni例子-简单计算器"是一个典型的示例,展示了如何利用JNI来创建一个Java应用程序,该程序能够调用C编写的动态链接库(.so文件)进行计算操作。 JNI是Java平台的一部分,它...

    Java再说JNI之实例

    Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。...通过学习这些实例,开发者可以进一步提升在Java中使用JNI的能力,解决特定问题并提升程序性能。

Global site tag (gtag.js) - Google Analytics