`

Ubuntu下使用JNI

    博客分类:
  • Java
阅读更多

------------------------------------------------------------------------------------------

学习:http://www.ibm.com/developerworks/cn/java/l-linux-jni/

Ubuntu Version:9.10

------------------------------------------------------------------------------------------

 

1. 定义一个Java类Hello:

public class Hello {

	// 显式地加载本地代码库
	static {
		try {
			// 此处即为本地方法所在链接库名
			System.loadLibrary("hello");
		} catch (UnsatisfiedLinkError e) {
			System.err.println("Cannot load hello library:\n" + e.toString());
		}
	}

	// 声明的本地方法, 必须指定 native 关键字
	public native void SayHello(String strName);

}

 

2. 生成本地链接库

1) 生成本地接口头文件:切换到 Hello.class 所在路径,执行:

javah Hello

 

 2) 在与 Hello.h 相同的路径下创建一个CPP文件 Hello.cpp, 该文件的内容如下:

#include "Hello.h"
#include <stdio.h>
//与Hello.h中函数声明相同
JNIEXPORT void JNICALL Java_Hello_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;
}

 

3) 编译生成共享库:执行:

g++ -I/home/lib/jdk1.6.0_20/include -I/home/lib/jdk1.6.0_20/include/linux -fPIC -c Hello.cpp

    生成 Hello.o:

g++ -shared -Wl,-soname,libhello.so.l -o libhello.so.1.0 Hello.o

    注:这里与原文不同,需要使用g++而非gcc ,关于g++与gcc的区别详见:http://blog.csdn.net/longxibendi/archive/2010/01/11/5177779.aspx

    将生成的共享库拷贝为标准文件名:

cp libhello.so.1.0 libhello.so

 

4) 通知动态链接程序此共享文件的路径:

export LD_LIBRARY_PATH='pwd':$LD_LIBRARY_PATH

 

3. 编写一个Java测试类ToSay:

public class ToSay {

	public static void main(String argv[]) {
		ToSay say = new ToSay();
	}

	public ToSay() {
		Hello h = new Hello();
		// 调用本地方法向John问好
		h.SayHello("John");
	}

}

     运行:

java ToSay

     出现:

Hello,John
分享到:
评论

相关推荐

    ubuntu上面使用jni例子

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

    ubuntu下第一个Jni例子

    这篇博客将引导我们完成在Ubuntu环境下创建并运行一个简单的JNI示例。 首先,我们需要了解JNI的基本概念。JNI接口提供了Java虚拟机(JVM)与本地代码之间的桥梁。当Java程序需要执行一些只能由原生代码完成的任务时...

    ubuntu_netbeans_jni

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

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

    - 编写JNI头文件:使用`javah`工具,输入Java类名,它会生成一个C++头文件,包含Java方法到本地函数的映射。 - 实现本地方法:在生成的C++源文件中,实现这些函数,确保函数签名与JNI头文件中的定义匹配。 - 配置...

    ubuntu上,java用的JNI AAC编码库

    本主题聚焦于在Ubuntu操作系统上,如何使用Java通过JNI调用AAC编码库,为Java应用程序提供高效的AAC音频编码能力。这里我们将详细讨论AAC编码库、JNI的概念以及如何在Ubuntu上进行集成和应用。 AAC(Advanced Audio...

    Ubuntu 使用Jni开发实例详解

    在Ubuntu环境下开发JNI应用程序,主要涉及以下几个步骤: 1. **编写Java文件并声明native方法**: 在Java类中,你需要声明一个native方法,该方法将在本地代码(通常是C或C++)中实现。例如,在`Prompt.java`文件...

    在ubuntu20.04 下java 调用QT写的C++动态库的demo

    1. 将Windows下生成的JNI头文件移植到Ubuntu。 2. 使用g++编译C++源码,链接到Qt库和生成的JNI头文件。 3. 编译Java代码,确保包含了jni.jar(Java SE的JNI库)。 4. 在Java代码中,通过`System.loadLibrary(...

    curl for android (arm, x86所有平台)下的静态库 ubuntu下编译完成

    本篇文章将深入探讨如何在Ubuntu环境下为Android(包括arm, x86等平台)编译静态库libcurl.a,并介绍如何通过Java JNI调用,以实现跨平台的网络通信。 首先,让我们关注标题中的关键信息:“curl for android (arm,...

    Ubuntu系统下Ecipse的安装及不能启动的解决办法

    Ubuntu系统下Ecipse的安装及不能启动的解决办法 概述:本文档介绍了在Ubuntu系统下安装Ecipse的步骤,并解决了Ecipse不能启动的问题。Ecipse是基于Java开发的集成开发环境(IDE),广泛应用于软件开发、测试和调试...

    山世光老师的SeetaFace改成安卓NDK编译,可随意加jni接口

    安卓调用接口,包括了检测,对齐,识别,在同一个程序中,附全部源码,含C源码,jni接口,安卓调用,可跟据你的需要随意加接口,首次运行会将几个老师的bin文件自动复制到本地存储的abdosoft.face文件夹下,训练的...

    JNI与C++数据类型传递示例(包括ArrayList对象、ArrayList嵌套返回)

    一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList&lt;ArrayList&lt;String&gt;&gt;等。

    springboot环境下java调用c程序生成动态链接库(.so文件),并调用(基于JNI,Ubuntu)+源代码+文档说明

    springboot环境下java调用c程序生成动态链接库(.so文件),并调用(基于JNI,Ubuntu) ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业...

    android jni调用详细解说

    对于Android开发来说,使用JNI可以实现用C/C++来编写性能关键部分的代码,然后在Java层调用这些原生方法。本篇文章将详细介绍如何在Android环境中配置并使用JNI。 **环境需求:** - **Windows XP + VMware + Ubuntu...

    c/c++Android开发环境配置

    3. 在项目根目录下,执行`cmake`生成Makefile,然后使用`make`进行编译。 4. 执行`make install`生成的bin目录下将包含打包到APK中的文件。 5. 使用Ant或其他构建工具(如Gradle)将Java和原生代码打包成APK。 完成...

    hello-jniCallback.zip

    标题中的"hello-jniCallback.zip"表明这是一个与JNI(Java Native Interface)相关的项目,其中可能包含了一个示例或教程,用于演示如何在Android应用中使用JNI进行回调操作。JNI是Java平台提供的一种标准机制,允许...

    hello-jni.zip

    【描述】描述中提到"ubuntu 16.04亲测可用",意味着这个项目已经在该版本的Linux环境下成功运行过,开发者可以放心在相同或兼容的环境中使用。值得注意的是,要成功运行此项目,你需要确保已经正确设置了NDK(Native...

    修改变量后的FFmpeg源码(版本:4.1.3.tar.bz2)可直接在Ubuntu下使用NDK 17C版本进行编译Android.So库文件

    在本案例中,提供的FFmpeg源码是经过特定修改的4.1.3版本,修复了某些变量错误,以便适应在Ubuntu操作系统下使用Android NDK 17C版本进行编译。 **FFmpeg基础知识:** FFmpeg的核心包括一系列的库,如libavcodec...

Global site tag (gtag.js) - Google Analytics