`
loovle
  • 浏览: 145172 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

linux下 java JNI调用动态链接库

    博客分类:
  • Java
阅读更多
JNI就是在java中调用非java代码,如果看到native声明的方法,肯定是有jni调用的,其实现是由其他语言写的程序,常用的是c,c++。
1 首先创建一个简单的java类:

public class Hello
{
 static
 {
  try
  {
//此处即为本地方法所在链接库名
   System.loadLibrary("hello");
  }
  catch(UnsatisfiedLinkError e)
  {
   System.err.println( "Cannot load hello library:\n " +
                                e.toString() );
  }
 }
 public Hello()
 {
 }
//声明的本地方法
  public native void SayHello(String strName);
} 


2 生成 Hello.h

javac Hello.java生成class文件
javah Hello生成hello.h

这个头文件就是根据了jni的规则来生成了native方法在c/c++的声明。下一步就需要新建c/c++文件来实现这里面的方法

3 在与Hello.h相同的路径下创建一个CPP文件Hello.cpp
#include "Hello.h"
JNIEXPORT void JNICALL Java_Hello_SayHello  (JNIEnv * env, jobject arg, jstring instring)
{
    const char *str = env->GetStringUTFChars( instring, JNI_FALSE );
    printf("Hello,%s\n",str);
    env->ReleaseStringUTFChars( instring, str );
    return;
}

4.编译生成共享库

a. 编译命令,生成Hello.o
g++ -I /usr/lib/jvm/java-6-sun-1.6.0.03/include -I /usr/lib/jvm/java-6-sun-1.6.0.03/include/linux -fPIC -c Hello.cpp
b.生成动态库文件,libhello.so.1.0
g++ -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 Hello.o

接下来将生成的共享库拷贝为标准文件名

cp libhello.so.1.0 libhello.so

最后通知动态链接程序此共享文件的路径。

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

这里用export 加入共享文件的路径,有时候会有点问题,比如:环境变量不会马上更新等等。

还有一个办法,就是直接将libhello.so拷贝到 /usr/lib 或者/lib 等系统库目录下


5.编写一个简单的Java程序来测试我们的本地方法。
import Hello;
import java.util.*;
public class ToSay
{
	public static void main(String argv[])
	{
		ToSay say = new ToSay();
	}
	public ToSay()
	{
		Hello h = new Hello();
		//调用本地方法向John问好
		h.SayHello("John");			
	}
}

用javac编译ToSay.java,生成ToSay.class
向执行普通Java程序一样使用java ToSay,我们会看到在屏幕上出现Hello,John

参考:http://watershitter.iteye.com/blog/477615
http://longrenrex.blog.sohu.com/93931899.html
分享到:
评论

相关推荐

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

    本篇文档将详细介绍如何在 Linux 和 Windows 平台上使用 Java 调用动态链接库(DLL 在 Windows 上称为 .dll 文件,在 Linux 上称为 .so 文件)。这通常涉及到三个主要步骤:编写 Java 接口、定义 C/C++ 头文件和实现...

    java调用动态链接库实例 java调用动态链接库实例 java调用动态链接库实例

    下面我们将详细讨论如何在Java中调用动态链接库,并以Linux环境下的SO库为例,提供一个实例。 1. **Java Native Interface (JNI)**: JNI是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。JNI...

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

    4. **编译C++代码**:将C++源代码编译为动态链接库(在Windows上是.dll,在Linux上是.so,在macOS上是.dylib)。确保正确链接了JNI库。 5. **加载库**:在Java中,`System.loadLibrary()`会加载前面创建的动态链接...

    java调用C语言编写的so库中的函数,java调用C语言编写的dll库中的函数

    本文将深入探讨这两种方法,以及如何在Java中调用C语言编写的SO(Linux下的动态链接库)和DLL(Windows下的动态链接库)中的函数。 首先,JNI是Java官方提供的原生接口,允许Java代码直接与本地代码交互。在Java中...

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

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

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

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

    Java调用动态链接库(Java 调用 DLL)

    Java调用动态链接库(DLL)是Java编程中一个比较特殊的技术,主要涉及到Java与本地代码的交互。在Windows系统中,DLL(Dynamic Link Library)是实现函数复用的一种方式,它包含了一系列可供其他程序调用的函数或数据...

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

    JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接库(DLL)。下面将详细介绍这个过程,包括基本概念、步骤以及在处理复杂类型如结构体和指针时的注意事项。 1. **JNI基础知识**: -...

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

    通过JNI调用第三方动态库在Android开发中是常见操作,涉及到的知识点包括Java本地方法声明、JNI接口定义、Makefile编写以及NDK编译。在实际操作过程中,务必注意代码的正确性,因为一个小错误都可能导致编译失败或...

    Java通过JNI调用C语言函数库的方法.zip

    这将生成一个动态链接库`libnative-lib.so`。 7. **运行Java程序** 将生成的本地库与Java类一起打包成jar文件,然后在Java程序中加载这个库,就可以调用本地方法了。例如: ```java public class Main { ...

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

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

    Java jni调用c实例

    接下来,我们需要编译C/C++代码为动态链接库,通常为`.dll`(Windows)或`.so`(Linux)。这通常涉及到设置正确的编译选项和链接到`libjvm`库。在本例中,`coreUtil`可能是一个项目文件,包含编译和链接设置。`...

    java调用c++动态链接库输出

    当Java需要调用C++编写的动态链接库(DLL)时,可以通过Java Native Interface (JNI) 或 Java Access Bridge (JNA) 来实现。本文将详细介绍如何创建C++动态链接库,并讨论如何让Java应用程序调用这些库。 1. 创建...

    java调用C的动态链接库

    在Java编程环境中,有时我们需要利用C语言编写的高效或特定功能的库,这时可以借助Java Native Interface (JNI) 来实现Java调用C的动态链接库。以下将详细讲解这一技术。 1. Java Native Interface (JNI) JNI是...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...

    java 的jni本地调用简单实例

    总结来说,这个实例展示了Java通过JNI调用C++本地方法的基本流程,包括Java端的声明、JNI头文件的生成、C++的实现、动态链接库的编译以及最终的调用。虽然这个实例没有涉及复杂的类型转换,但在实际应用中,根据数据...

    LINUX调用JNI动态库.txt

    1. **配置环境变量**:为了使Java程序能够找到动态链接库`libgoodluck.so`,需要设置环境变量`LD_LIBRARY_PATH`。 - 设置命令:`export LD_LIBRARY_PATH=/home/swan/lib` 2. **运行Java程序**:最后,运行Java...

    java调用动态链接库例程(测试通过)及库包 jna4.3

    总结一下,这个压缩包提供了使用JNA 4.3在Java中调用动态链接库的完整示例。`mathfundll.dll`是待调用的底层库,`mathfundll.java`定义了与DLL函数对应的Java接口,而`testmathfundll.java`则包含了测试代码,确保...

    java程序中加载动态链接库文件

    这时,就需要借助于Java Native Interface (JNI) 来调用C/C++编写的动态链接库(DLL或SO文件),从而实现对底层硬件的访问或其他特定需求。 #### 二、Java Native Interface (JNI) Java Native Interface 是Java平台...

Global site tag (gtag.js) - Google Analytics