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
分享到:
相关推荐
本篇文档将详细介绍如何在 Linux 和 Windows 平台上使用 Java 调用动态链接库(DLL 在 Windows 上称为 .dll 文件,在 Linux 上称为 .so 文件)。这通常涉及到三个主要步骤:编写 Java 接口、定义 C/C++ 头文件和实现...
下面我们将详细讨论如何在Java中调用动态链接库,并以Linux环境下的SO库为例,提供一个实例。 1. **Java Native Interface (JNI)**: JNI是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。JNI...
4. **编译C++代码**:将C++源代码编译为动态链接库(在Windows上是.dll,在Linux上是.so,在macOS上是.dylib)。确保正确链接了JNI库。 5. **加载库**:在Java中,`System.loadLibrary()`会加载前面创建的动态链接...
本文将深入探讨这两种方法,以及如何在Java中调用C语言编写的SO(Linux下的动态链接库)和DLL(Windows下的动态链接库)中的函数。 首先,JNI是Java官方提供的原生接口,允许Java代码直接与本地代码交互。在Java中...
在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...
在这种情况下,"springboot+jna/jni调用动态so/dll库"是一个重要的主题,它涉及到Spring Boot应用如何利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用操作系统级别的动态链接库(.so...
Java调用动态链接库(DLL)是Java编程中一个比较特殊的技术,主要涉及到Java与本地代码的交互。在Windows系统中,DLL(Dynamic Link Library)是实现函数复用的一种方式,它包含了一系列可供其他程序调用的函数或数据...
JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接库(DLL)。下面将详细介绍这个过程,包括基本概念、步骤以及在处理复杂类型如结构体和指针时的注意事项。 1. **JNI基础知识**: -...
通过JNI调用第三方动态库在Android开发中是常见操作,涉及到的知识点包括Java本地方法声明、JNI接口定义、Makefile编写以及NDK编译。在实际操作过程中,务必注意代码的正确性,因为一个小错误都可能导致编译失败或...
这将生成一个动态链接库`libnative-lib.so`。 7. **运行Java程序** 将生成的本地库与Java类一起打包成jar文件,然后在Java程序中加载这个库,就可以调用本地方法了。例如: ```java public class Main { ...
在Java编程环境中,有时我们需要利用C++编写的高性能或特定功能的库,这时可以借助Java的JNI(Java Native Interface)技术来调用C++编写的动态链接库(DLL)。本教程将详细介绍如何在Java中调用C++动态库,并通过...
接下来,我们需要编译C/C++代码为动态链接库,通常为`.dll`(Windows)或`.so`(Linux)。这通常涉及到设置正确的编译选项和链接到`libjvm`库。在本例中,`coreUtil`可能是一个项目文件,包含编译和链接设置。`...
当Java需要调用C++编写的动态链接库(DLL)时,可以通过Java Native Interface (JNI) 或 Java Access Bridge (JNA) 来实现。本文将详细介绍如何创建C++动态链接库,并讨论如何让Java应用程序调用这些库。 1. 创建...
在Java编程环境中,有时我们需要利用C语言编写的高效或特定功能的库,这时可以借助Java Native Interface (JNI) 来实现Java调用C的动态链接库。以下将详细讲解这一技术。 1. Java Native Interface (JNI) JNI是...
JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...
总结来说,这个实例展示了Java通过JNI调用C++本地方法的基本流程,包括Java端的声明、JNI头文件的生成、C++的实现、动态链接库的编译以及最终的调用。虽然这个实例没有涉及复杂的类型转换,但在实际应用中,根据数据...
1. **配置环境变量**:为了使Java程序能够找到动态链接库`libgoodluck.so`,需要设置环境变量`LD_LIBRARY_PATH`。 - 设置命令:`export LD_LIBRARY_PATH=/home/swan/lib` 2. **运行Java程序**:最后,运行Java...
总结一下,这个压缩包提供了使用JNA 4.3在Java中调用动态链接库的完整示例。`mathfundll.dll`是待调用的底层库,`mathfundll.java`定义了与DLL函数对应的Java接口,而`testmathfundll.java`则包含了测试代码,确保...
这时,就需要借助于Java Native Interface (JNI) 来调用C/C++编写的动态链接库(DLL或SO文件),从而实现对底层硬件的访问或其他特定需求。 #### 二、Java Native Interface (JNI) Java Native Interface 是Java平台...