`

Linux下JNI调用

阅读更多

 做 项目,无论是遗留产品的再生产,还是对遗留产品的再利用,都不可避免的会出现一大堆的异构现象。解决异构通信问题是这类项目的主要问题。以前看见这种情况 第一个解决方案就是Socket通信。说实在的自己实现Socket通信,定制通信协议,或者是实现已有的通信协议都是很头痛的事情。本人有不堪回首的历 史经历。

    最近同样在项目中需要去解决一个异构问题,由于时间的紧迫,以及先天的运行环境(两个部分是运行在同一台机器上的)。考虑到了使用JNI,结果表明JNI 是完全可以胜任目前的角色的。以前没有了解过JNI,总是以为它这不好那不好,用了用,表现还不错,而且实现起来非常之简单。

    整个实现过程可以分为五步来完成:

1)写一个声明了native的Java文件:

package example;

public   class  TestJNI 
{
    
static  
{
        System.loadLibrary(
" test "
);
    }

    
    
public  native String getNameCPP();
}


2)  使用javah产生对应的CPP头文件:
命令:javah -classpath <path> -jni example.TestJNI -d <out_dir>
生成的头文件example_TestJNI.h如下:
/*  DO NOT EDIT THIS FILE - it is machine generated  */
#include 
< jni.h >
/*  Header for class example_TestJNI  */

#ifndef _Included_example_TestJNI
#define  _Included_example_TestJNI
#ifdef __cplusplus
extern   " C "   {
#endif
/*
 * Class:     example_TestJNI
 * Method:    getNameForCPP
 * Signature: ()Ljava/lang/String;
 
*/
JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
  (JNIEnv 
* , jobject);

#ifdef __cplusplus
}

#endif
#endif

3)实现对应的CPP代码:
#include  " example_TestJNI.h "
#include 
< string >

JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
  (JNIEnv 
*  env, jobject)
{
    
// TODO 可以在此调用其他的代码
    std:: string  strName  =   " Tower " ;
    
return  env -> NewStringUTF(strName.c_str());
}


4) 编译CPP代码
命 令:g++ -o libtest.so -shared -I<include_path> -I<java_home>/include -I<java_home>/include/linux example_TestJNI.cpp

5)执行
package example;

public   class  Test  {
    
public   static   void  main(String[] args)  {
        TestJNI test 
=   new  TestJNI();
        System.
out .println( " Hello  "   +  test.getNameForCPP());
    }

}


export LD_EXPORT_PATH=<so_path>
java -cp <path> -Djava.library.path=<so_path> example.Test
输出:Hello Tower

export LD_EXPORT_PATH=.  当前路径
java -cp . -Djava.library.path=. example.Test

类和SO 文件都在当前目录,so的命名是lib***.so  比如libhello.so,
说明在java代码中载入的hello本地库


分享到:
评论

相关推荐

    linux C JNI调用java

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

    android 使用jni调用c++

    本教程将详细介绍如何在Android项目中使用JNI调用C++代码。 首先,你需要配置Android的NDK(Native Development Kit)。NDK是一组工具,开发者可以用它来编写用C和C++编写的应用程序模块,这些模块可以直接在...

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

    在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...

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

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

    通过JNI调用第三方动态库(生成两个.so文件)

    本示例将详细介绍如何通过JNI调用第三方动态库,并生成两个.so文件。 首先,我们需要了解.so文件在Android中的角色。在Linux系统(包括Android)中,.so文件是共享库的扩展名,这些库通常包含了C/C++编译的原生代码...

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

    Java 通过 JNI 调用 C++ 的 DLL 文件 JNI(Java Native Interface)是一种允许 Java 代码和本地应用程序交互的技术。通过 JNI,Java 应用程序可以调用本地库,反之亦然。本文将详细介绍如何使用 JNI 将 Java 应用...

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    ### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...

    jni调用IE,延迟一段时间关闭

    标题中的“JNI调用IE,延迟一段时间关闭”指的是在Java程序中通过JNI(Java Native Interface)技术调用本地系统资源,比如Internet Explorer浏览器,并且在指定的时间延迟后自动关闭浏览器。这种技术通常用于自动化...

    Jni调用Demo

    4. **编译本地方法**:将C/C++代码编译成动态链接库(如Windows下的.dll,Linux下的.so,MacOS下的.dylib)。 5. **加载库**:在Java代码的静态块中,通过`System.loadLibrary()`加载编译好的动态链接库。 6. **...

    JNI调用C++的应用实例

    《JNI调用C++的应用实例》 JNI,全称Java Native Interface,是Java平台中用于实现Java代码与其他语言(如C/C++)交互的关键技术。自Java 1.1起,JNI已成为Java平台的标准组成部分,它允许Java应用程序利用本地代码...

    JNI调用第三方dll实例

    在本实例中,我们将深入探讨如何使用JNI调用第三方DLL(动态链接库)文件,这是在Java应用程序中利用C++或C代码能力的常见场景。这个实例是在Visual Studio 2010环境下构建的,但请注意,其他环境可能需要不同的配置...

    springboot+jna/jni调用动态so/dll库

    在这种情况下,"springboot+jna/jni调用动态so/dll库"是一个重要的主题,它涉及到Spring Boot应用如何利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用操作系统级别的动态链接库(.so...

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

    Java程序可以通过JNI调用本地方法,这些本地方法是用其他语言编写的,并通过JNI接口暴露给Java。这个过程涉及到以下几个步骤: 1. **创建本地方法声明**:在Java类中,你需要声明本地方法。这些方法没有具体实现,...

    Java jni调用c实例

    在这个"Java jni调用c实例"中,我们将深入探讨如何通过JNI在Java应用程序中调用C语言编写的函数。 首先,我们需要了解JNI的基本结构。一个典型的JNI程序包括Java源代码、C/C++源代码以及对应的头文件。Java源代码中...

    jni调用c来实现

    本篇将详细介绍如何使用JNI调用C语言来实现特定的功能。 首先,理解JNI的基本概念是关键。JNI提供了一种机制,让Java虚拟机(JVM)能够调用本地(Native)代码,也就是非Java语言编写的代码,通常是C或C++。这个...

    LINUX调用JNI动态库.txt

    ### Linux平台调用JNI动态库知识点详解 #### 一、JNI简介 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言写的代码进行交互。JNI在不同的平台上有着广泛的应用,尤其是在Linux这样...

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

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

    Android下JNI和HAL技术

    例如,在处理3G通信时,应用程序层(APP:Phone)通过Java调用framework层的telephony java代码,该代码又通过JNI调用底层的C语言实现,与Linux内核中的PPP协议交互,最终与3G模块通信。 开发JNI和HAL技术涉及的知识...

    JNI调用第三方库文件

    4. **编译动态链接库**:将C/C++代码编译成适合目标操作系统的动态链接库(如Windows下的.dll,Linux下的.so,Mac下的.dylib)。这通常需要指定JNI库路径和正确的链接选项。 5. **加载动态链接库**:在Java代码中,...

Global site tag (gtag.js) - Google Analytics