Linux平台Java调用so库-JNI使用例子

转自:http://blog.chinaunix.net/uid-20180960-id-1972669.html

2010-08-11 22:17

1.确保gcc编译器已安装

2.编写HelloJNI.java代码,用native声明需要用C实现的函数。
如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/home/swan/test/net/wangliping/HelloJNI.java

package net.wangliping

public class HelloJNI
{
    static
    {

System.loadLibrary("goodluck");
    }

public native static int get();
    public native static void set(int i);

public static void main(String[] args)
    {
        HelloJNI test = new HelloJNI();
        test.set(10);
        System.out.println(test.get());
    }
}

3.在HelloJNI.java文件所在目录下编译.java文件。

javac HelloJNI.java

4.在~/Desktop下编译第三步中生成的.class文件,生成对应的.h头文件,本例中生成的头文件名为 net_wangliping_HelloJNI.h

javah net.wangliping.HelloJNI

5.编写HelloJNI.c文件,实现引用第4步中生成的.h头文件,并实现其中声明的方法。

#include "net_wangliping_HelloJNI.h"

int i = 0;

JNIEXPORT jint JNICALL Java_net_wangliping_HelloJNI_get(JNIEnv *env, jclass jc)
{
    return i;
}

JNIEXPORT void JNICALL Java_net_wangliping_HelloJNI_set(JNIEnv *env, jclass jc, jint j)
{
    i = j;
}

6.将第5步中编写的HelloJNI.c文件,编译成.o文件

gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux -c HelloJNI.c

注:/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include 是jni.h头文件所在的路径
/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux 是jni_md.h所在的路径

7.将第6步中生成的HelloJNI.o文件编译成.so库文件

gcc -shared HelloJNI.o -o libgoodluck.so

注:和windows下不同,linux的库文件必须是以libxxx.so形式命令的(或者 libxxx.so.y,y是版本号),lib前缀是为了系统能够识别它,xxx是java代码System.loadLibrary("xxx");中引用库的名字。

8.将第7步中生成的libgoodluck.so文件拷贝到java的加载库LD_LIBRARY_PATH指向的路径中。
前提是你有足够的权限,如果没有sudo权限的同学,用下面的方法:
1) 在/home下建立一个用来存放.so库文件的目录,比如/home/swan/lib
2) 把libgoodluck.so文件拷贝到该目录下
3)打开Terminal,运行如下命令

export LD_LIBRARY_PATH=/home/swan/lib

只在当前shell下有效...

本博主转烛补充:以下方法可以直接利用绝对路径来load这个so库文件,从而无需做上述的放置path或者更改库路径的动作。

static {    System.load("/home/swan/test/libgoodluck.so");}

9.在运行HelloJNI.class

java net.wangliping.HelloJNI

一切正常后,可以看到运行結果是输出了10,其值是由C语言代码实现并返回的。

时间: 2024-08-04 14:34:39

Linux平台Java调用so库-JNI使用例子的相关文章

Linux下JNA 调用 so 库

原文:https://blog.csdn.net/withiter/article/details/8077470 博文链接:https://i.cnblogs.com/EditPosts.aspx?opt=1在linux下使用jna调用本地方法的时候,需要将C写成的程序编译为so文件 1.写一个简单test.c文件: #include<stdio.h>int add(int a,int b);int add(int a,int b){      int c = a + b ;      re

linux下如何调用opencv库生成

首先先简介下linux系统下程序的库函数分为三种类型: 1.静态函数库:在程序执行前加入到目标程序中: 2.共享函数库:在程序启动的时候加载到程序中,被不同程序共享: 3.动态函数库:在程序运行的任何时候动态的加载 linux 下的.o文件是目标文件相当于windows的obj文件: .so文件是共享库相当于windows的shared object: .a文件是静态库由好多个.o文件合在一起,用于静态链接: .la为libtool自动生成的一些共享库:

linux平台下使用boost库

1. 下载boost编译后,boost头文件最好拷到/usr/include下,或者在/usr/include下有链接. stage/lib/libboost_*中的库文件最好拷到/usr/lib中. 这样用g++运行时,可以不用指定-I$BOOST_INCLUDE和-L$BOOST_LIB. 2. 运行 g++ main.cpp SourceLine.cpp FileTravel.cpp -I$BOOST_INCLUDE -L$BOOST_LIB -lboost_filesystem 出现如下

Delphi XE调用第三方库Jni详细过程

1.有.so库 2.有.Jar库 jar库其实是一个zip格式的压缩包,里面放META-INF目录,目录下一个MANIFEST.MF文件, Manifest-Version: 1.0Created-By: 1.7.0_25 (Oracle Corporation) .so文件在Development中加载,路径需要设置为Libary\lib\armeabi-v7a\ .jar文件在库中添加 .so文件类似与windows下的dll,而jar中需要打包dll的class 如: [JavaSigna

关于Java在Linux or Android平台调用.so库

Linux平台Java调用so库-JNI使用例子 android NDK开发及调用标准linux动态库.so文件 在Android项目中调用已有.so库 Android 调用.so文件 jni Android Eclipse JNI 调用 .so文件加载问题

静态库和动态库的区别和win平台和linux平台代码实现

什么是库 库是写好的,现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib)和动态库(.so..dll). 所谓静态.动态是指链接.回顾一下,将一个程序编译成可执行程序的步骤: 图1.编译过程 静态库 之所以称为[静态库],是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中.因此对应的

动态调用动态库方法 .so

关于动态调用动态库方法说明 一.       动态库概述 1.  动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输 出操作或屏幕控制等标准任务函数).可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库.库文件中的函数 可以通过连接程序与应用程序进行链接,这样就不必在每次开发程序时都对这些通用的函数进行编译了. 动态库是一种在已经编译完毕的程序开始启动运行时,才被加载来调用其中函数的库.其加载方式与静态库截然

在 Linux 平台下使用 JNI

引言 Java 的出现给大家开发带来的极大的方便.但是,如果我们有大量原有的经过广泛测试的非 Java 代码,将它们全部用 Java 来重写,恐怕会带来巨大的工作量和长期的测试:如果我们的应用中需要访问到特定的设备,甚至是仅符合公司内部信息交互规范的设备,或某个特定的操作系统才有的特性,Java 就显得有些力不从心了.面对这些问题,Sun 公司在 JDK1.0 中就定义了 JNI 规范,它规定了 Java 应用程序对本地方法的调用规则. 实现步骤及相关函数使用 本文将一步步说明在 Linux 平

android开发教程(4)— jni编程之采用 javah 从java调用C++

用Java调用C/C++代码 当无法用 Java 语言编写整个应用程序时,JNI 允许您使用本机代码.在下列典型情况下,您可能决定使用本机代码: 希望用更低级.更快的编程语言去实现对时间有严格要求的代码. 希望从 Java 程序访问旧代码或代码库. 需要标准 Java 类库中不支持的依赖于平台的特性. 须知:SWIG和javah的区别(强烈推荐) 我看了网上的关于 jni编程 的教程很多,但不尽相同,刚开始会犯迷糊.我想笔者往往忽略了一个关键点,那就是采用了什么方式决定了步骤的流程.有两种生成