------------------------------------------------------------------------------------------
学习: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程序的示例。 JNI的核心在于创建本地方法接口,这些接口允许Java代码调用C/C++编写的函数,反之亦然。下面我们将深入探讨在...
这篇博客将引导我们完成在Ubuntu环境下创建并运行一个简单的JNI示例。 首先,我们需要了解JNI的基本概念。JNI接口提供了Java虚拟机(JVM)与本地代码之间的桥梁。当Java程序需要执行一些只能由原生代码完成的任务时...
【标签】:“ubuntu”、“linux”、“netbeans”、“jni”、“配置” 这些标签表明主要内容会涵盖Ubuntu系统下的配置环境,使用NetBeans IDE进行C/C++和Java的集成开发,以及JNI的配置和应用。 【部分内容】 提到的...
- 编写JNI头文件:使用`javah`工具,输入Java类名,它会生成一个C++头文件,包含Java方法到本地函数的映射。 - 实现本地方法:在生成的C++源文件中,实现这些函数,确保函数签名与JNI头文件中的定义匹配。 - 配置...
本主题聚焦于在Ubuntu操作系统上,如何使用Java通过JNI调用AAC编码库,为Java应用程序提供高效的AAC音频编码能力。这里我们将详细讨论AAC编码库、JNI的概念以及如何在Ubuntu上进行集成和应用。 AAC(Advanced Audio...
在Ubuntu环境下开发JNI应用程序,主要涉及以下几个步骤: 1. **编写Java文件并声明native方法**: 在Java类中,你需要声明一个native方法,该方法将在本地代码(通常是C或C++)中实现。例如,在`Prompt.java`文件...
1. 将Windows下生成的JNI头文件移植到Ubuntu。 2. 使用g++编译C++源码,链接到Qt库和生成的JNI头文件。 3. 编译Java代码,确保包含了jni.jar(Java SE的JNI库)。 4. 在Java代码中,通过`System.loadLibrary(...
本篇文章将深入探讨如何在Ubuntu环境下为Android(包括arm, x86等平台)编译静态库libcurl.a,并介绍如何通过Java JNI调用,以实现跨平台的网络通信。 首先,让我们关注标题中的关键信息:“curl for android (arm,...
Ubuntu系统下Ecipse的安装及不能启动的解决办法 概述:本文档介绍了在Ubuntu系统下安装Ecipse的步骤,并解决了Ecipse不能启动的问题。Ecipse是基于Java开发的集成开发环境(IDE),广泛应用于软件开发、测试和调试...
安卓调用接口,包括了检测,对齐,识别,在同一个程序中,附全部源码,含C源码,jni接口,安卓调用,可跟据你的需要随意加接口,首次运行会将几个老师的bin文件自动复制到本地存储的abdosoft.face文件夹下,训练的...
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
springboot环境下java调用c程序生成动态链接库(.so文件),并调用(基于JNI,Ubuntu) ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业...
对于Android开发来说,使用JNI可以实现用C/C++来编写性能关键部分的代码,然后在Java层调用这些原生方法。本篇文章将详细介绍如何在Android环境中配置并使用JNI。 **环境需求:** - **Windows XP + VMware + Ubuntu...
3. 在项目根目录下,执行`cmake`生成Makefile,然后使用`make`进行编译。 4. 执行`make install`生成的bin目录下将包含打包到APK中的文件。 5. 使用Ant或其他构建工具(如Gradle)将Java和原生代码打包成APK。 完成...
标题中的"hello-jniCallback.zip"表明这是一个与JNI(Java Native Interface)相关的项目,其中可能包含了一个示例或教程,用于演示如何在Android应用中使用JNI进行回调操作。JNI是Java平台提供的一种标准机制,允许...
【描述】描述中提到"ubuntu 16.04亲测可用",意味着这个项目已经在该版本的Linux环境下成功运行过,开发者可以放心在相同或兼容的环境中使用。值得注意的是,要成功运行此项目,你需要确保已经正确设置了NDK(Native...
在本案例中,提供的FFmpeg源码是经过特定修改的4.1.3版本,修复了某些变量错误,以便适应在Ubuntu操作系统下使用Android NDK 17C版本进行编译。 **FFmpeg基础知识:** FFmpeg的核心包括一系列的库,如libavcodec...