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

在Linux平台下使用JNI

    博客分类:
  • J
阅读更多
参考: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中jni(生成dll)Linux中jni(生成so),java调用曾c++

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

    jni学习例子 在linux下执行成功

    在本示例中,我们看到的是一个JNI的学习实践,它在Linux环境下成功地执行了。这个例子展示了如何通过Java调用本地(C/C++)代码,并且提供了完整的流程,包括从Java类型转换为C类型,特别是将`jstring`转化为`char`...

    详细的JNI操作步骤(LINUX)

    在Linux环境下使用JNI,通常涉及到以下步骤: 一、环境准备 在开始之前,确保你已经安装了JDK,因为JNI开发需要用到javah工具。同时,还需要一个C/C++编译器,如GCC,用于编写和编译本地方法。 二、创建Java类 ...

    linux JNI实例及其JNI编程模板

    Linux JNI(Java Native Interface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在各种场景中都有应用,比如提升性能、调用操作系统底层功能、集成C/C++库等。本教程将深入探讨Linux环境下...

    JNI的两个头文件jni.h和jni_md.h

    JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者利用硬件特性等。本文将深入探讨JNI的两个核心头文件——`jni.h`和`jni_md.h`。 首先,`jni.h`是JNI的主要接口头文件,包含了所有JNI的...

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

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

    jni.zip jni编译jni下载

    JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地代码集成。 在描述中提到的`jni.h`和`jni_md.h`是JNI编程中必不可少的头文件。`jni.h`包含了JNI接口的...

    ubuntu上面使用jni例子

    这个"ubuntu上面使用jni例子"的压缩包很可能是提供了一个在Ubuntu环境下开发和运行JNI程序的示例。 JNI的核心在于创建本地方法接口,这些接口允许Java代码调用C/C++编写的函数,反之亦然。下面我们将深入探讨在...

    Linux on POWER 的 JNI 编程实例

    在这个实例中,我们将探讨如何在Linux on POWER系统上使用C/C++和JNI来实现高效、低级别的编程。 首先,了解JNI的基本结构至关重要。JNI接口定义了一系列的函数,这些函数允许Java代码创建和操作本地方法。本地方法...

    ubuntu_netbeans_jni

    【标签】:“ubuntu”、“linux”、“netbeans”、“jni”、“配置” 这些标签表明主要内容会涵盖Ubuntu系统下的配置环境,使用NetBeans IDE进行C/C++和Java的集成开发,以及JNI的配置和应用。 【部分内容】 提到的...

    android下JNI使用方法

    Android下的JNI(Java Native Interface)是一种允许Java代码与其他语言(如C、C++)交互的技术。JNI是Java 2 SDK的一部分,它提供了在Java程序中调用本地(非Java)代码的能力。当Java标准库无法满足特定需求,如...

    linux C JNI调用java

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

    andorid使用jni执行shell命令例子

    本文将详细介绍如何在Android应用中使用JNI来执行shell命令。 首先,我们需要理解JNI的概念。JNI是Java平台提供的一种机制,它允许Java代码和其他语言写的代码进行交互。通过JNI,我们可以在Java应用程序中调用C/...

    java中RCP中使用JNI

    在Java RCP中使用JNI,主要是为了访问特定于平台的功能,提升性能,或者调用已有的本地库。 1. **JNI简介** JNI是一种接口,允许Java代码与其他语言编写的代码进行通信。它定义了一套规范,使得Java虚拟机(JVM)...

    android 使用jni调用c++

    JNI在很多场景下都非常有用,比如利用C++的高性能处理图像、音频或者进行复杂的数学运算,以及接入原生库。本教程将详细介绍如何在Android项目中使用JNI调用C++代码。 首先,你需要配置Android的NDK(Native ...

    java JNI开发 linux平台学习开发模板

    本教程是关于在Linux平台上使用JNI进行开发的一个学习模板。 首先,我们来看`JavaMain.java`这个文件。这是Java应用程序的主入口点,它将通过JNI调用C/C++编写的本地方法。在JavaMain.java中,你会看到一个`native`...

    java的JNI跨平台技术

    3. **跨平台兼容性**:虽然Java本身具有良好的跨平台能力,但使用JNI技术时需要注意不同操作系统下的兼容性问题。例如,可能需要为不同的操作系统编译不同的本地库。 #### 七、结论 JNI技术作为连接Java与本地代码...

    JNI如何使用stl

    JNI在很多场景下都是必要的,比如调用操作系统API、优化性能关键部分或者利用已有的C/C++库。本篇文章将深入探讨如何在Java程序中使用JNI来操作C++的STL(Standard Template Library,标准模板库)。 STL是C++的一...

Global site tag (gtag.js) - Google Analytics