参考:http://www.ibm.com/developerworks/cn/java/l-linux-jni/
但参考中的版本过于古老,不利于初学者参照。
环境: gentoo, jdk-1.6, gcc version 4.3.4 (Gentoo 4.3.4 p1.0, pie-10.1.5)
1.
$ vi HelloJni.java
$ cat HelloJni.java
class HelloJni {
public native void SayHello(String name);
static {
try {
System.loadLibrary("HelloJni");
}
catch (UnsatisfiedLinkError e) {
System.err.println("Cannot load HelloJni library:\n " +
e.toString());
}
}
}
2.
$ export CLASSPATH=.:$CLASSPATH
$ javac HelloJni.java
3.
$ javah -classpath . HelloJni
4.
$ vim HelloJni.cpp
$ cat HelloJni.cpp
#include "HelloJni.h"
#include <stdio.h>
//@see HelloJni.h function
JNIEXPORT void JNICALL Java_HelloJni_SayHello (
JNIEnv * env, jobject arg, jstring instring) {
//从instring字符串取得指向字符串UTF编码的指针
const jbyte *str =
(const jbyte *)env->GetStringUTFChars(instring, JNI_FALSE);
printf("Hello, %s\n", str);
//通知虚拟机本地代码不再需要通过str访问Java字符串。
env->ReleaseStringUTFChars(instring, (const char *)str);
return;
}
5.
$ g++ -fPIC -O2 -shared -Wl,-soname,libHelloJni.so.1 -o libHelloJni.so.1.0 -I/opt/sun-jdk-1.6.0.17/include/ -I/opt/sun-jdk-1.6.0.17/include/linux HelloJni.cpp
$ ln -sf libHelloJni.so.1.0 libHelloJni.so.1
$ ln -sf libHelloJni.so.1 libHelloJni.so
lrwxrwxrwx 1 mg mg 16 2010-04-07 13:28 libHelloJni.so -> libHelloJni.so.1
lrwxrwxrwx 1 mg mg 18 2010-04-07 13:28 libHelloJni.so.1 -> libHelloJni.so.1.0
-rwxr-xr-x 1 mg mg 6659 2010-04-07 14:20 libHelloJni.so.1.0
6.
$ vim ToSay.java
$ cat ToSay.java
import java.util.*;
public class ToSay {
public static void main(String argv[]) {
ToSay say = new ToSay();
}
public ToSay() {
HelloJni h = new HelloJni();
//调用本地方法向Marlgl问好
h.SayHello("Marlgl");
}
}
$ javac ToSay.java
$ java ToSay
Hello, Marlgl
分享到:
相关推荐
在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...
在本示例中,我们看到的是一个JNI的学习实践,它在Linux环境下成功地执行了。这个例子展示了如何通过Java调用本地(C/C++)代码,并且提供了完整的流程,包括从Java类型转换为C类型,特别是将`jstring`转化为`char`...
在Linux环境下使用JNI,通常涉及到以下步骤: 一、环境准备 在开始之前,确保你已经安装了JDK,因为JNI开发需要用到javah工具。同时,还需要一个C/C++编译器,如GCC,用于编写和编译本地方法。 二、创建Java类 ...
Linux JNI(Java Native Interface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在各种场景中都有应用,比如提升性能、调用操作系统底层功能、集成C/C++库等。本教程将深入探讨Linux环境下...
JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者利用硬件特性等。本文将深入探讨JNI的两个核心头文件——`jni.h`和`jni_md.h`。 首先,`jni.h`是JNI的主要接口头文件,包含了所有JNI的...
本篇文档将详细介绍如何在 Linux 和 Windows 平台上使用 Java 调用动态链接库(DLL 在 Windows 上称为 .dll 文件,在 Linux 上称为 .so 文件)。这通常涉及到三个主要步骤:编写 Java 接口、定义 C/C++ 头文件和实现...
JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地代码集成。 在描述中提到的`jni.h`和`jni_md.h`是JNI编程中必不可少的头文件。`jni.h`包含了JNI接口的...
这个"ubuntu上面使用jni例子"的压缩包很可能是提供了一个在Ubuntu环境下开发和运行JNI程序的示例。 JNI的核心在于创建本地方法接口,这些接口允许Java代码调用C/C++编写的函数,反之亦然。下面我们将深入探讨在...
在这个实例中,我们将探讨如何在Linux on POWER系统上使用C/C++和JNI来实现高效、低级别的编程。 首先,了解JNI的基本结构至关重要。JNI接口定义了一系列的函数,这些函数允许Java代码创建和操作本地方法。本地方法...
【标签】:“ubuntu”、“linux”、“netbeans”、“jni”、“配置” 这些标签表明主要内容会涵盖Ubuntu系统下的配置环境,使用NetBeans IDE进行C/C++和Java的集成开发,以及JNI的配置和应用。 【部分内容】 提到的...
Android下的JNI(Java Native Interface)是一种允许Java代码与其他语言(如C、C++)交互的技术。JNI是Java 2 SDK的一部分,它提供了在Java程序中调用本地(非Java)代码的能力。当Java标准库无法满足特定需求,如...
通过以上步骤,我们完成了在Linux环境下使用C语言通过JNI调用Java类的全过程。这种技术广泛应用于高性能计算、系统集成、设备驱动等多个场景,是Java和C/C++混合编程的关键技术。在实际应用中,可能还需要处理更复杂...
本文将详细介绍如何在Android应用中使用JNI来执行shell命令。 首先,我们需要理解JNI的概念。JNI是Java平台提供的一种机制,它允许Java代码和其他语言写的代码进行交互。通过JNI,我们可以在Java应用程序中调用C/...
在Java RCP中使用JNI,主要是为了访问特定于平台的功能,提升性能,或者调用已有的本地库。 1. **JNI简介** JNI是一种接口,允许Java代码与其他语言编写的代码进行通信。它定义了一套规范,使得Java虚拟机(JVM)...
JNI在很多场景下都非常有用,比如利用C++的高性能处理图像、音频或者进行复杂的数学运算,以及接入原生库。本教程将详细介绍如何在Android项目中使用JNI调用C++代码。 首先,你需要配置Android的NDK(Native ...
本教程是关于在Linux平台上使用JNI进行开发的一个学习模板。 首先,我们来看`JavaMain.java`这个文件。这是Java应用程序的主入口点,它将通过JNI调用C/C++编写的本地方法。在JavaMain.java中,你会看到一个`native`...
3. **跨平台兼容性**:虽然Java本身具有良好的跨平台能力,但使用JNI技术时需要注意不同操作系统下的兼容性问题。例如,可能需要为不同的操作系统编译不同的本地库。 #### 七、结论 JNI技术作为连接Java与本地代码...
JNI在很多场景下都是必要的,比如调用操作系统API、优化性能关键部分或者利用已有的C/C++库。本篇文章将深入探讨如何在Java程序中使用JNI来操作C++的STL(Standard Template Library,标准模板库)。 STL是C++的一...