文档章节

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

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:39
字数 645
阅读 24
收藏 0

JNI理解图:



1.确保gcc编译器已安装

2.编写HelloJNI.java代码,用native声明需要用C实现的函数。



<span style="color: rgb(102, 102, 102);">package</span><span style="color:#ff0000;"> net.wangliping</span><span style="color:#666666;">
public class </span><span style="color:#ff0000;">HelloJNI</span><span style="color:#666666;">
{
    static
    {
        System.loadLibrary("goodluck");
    }
    public native static int </span><span style="color:#ff0000;">get</span><span style="color:#666666;">();
    public native static void </span><span style="color:#ff0000;">set</span><span style="color:#666666;">(int i);
    public static void main(String[] args)
    {
        HelloJNI test = new HelloJNI();
        test.set(10);
        System.out.println(test.get());
    }
</span>

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

javac HelloJNI.java

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

javah net.wangliping.HelloJNI

5.编写HelloJNI.c文件,实现引用第4步中生成的.h头文件,并实现其中声明的方法。(PS:注意C/C++里面的方法命名方式,红色部分)

<span style="color:#666666;">#include "net_wangliping_HelloJNI.h"
int i = 0;
JNIEXPORT jint JNICALL </span><span style="color:#ff0000;">Java_net_wangliping_HelloJNI_get</span><span style="color:#666666;">(JNIEnv *env, jclass jc)
{
    return i;
}
JNIEXPORT void JNICALL </span><span style="color:#ff0000;">Java_net_wangliping_HelloJNI_set</span><span style="color:#666666;">(JNIEnv *env, jclass jc, jint j)
{
    i = j;
}</span>





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语言代码实现并返回的。



本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/44960709

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
Android JNI本地编程 快速入门

一、JNI(Java Native Interface) 1、什么是JNI: JNI(Java Native Interface):java本地开发接口 JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++) 外部的c/c++代码也可以调...

天王盖地虎626
01/22
8
0
Android小白成长之初级篇:NDK配置

AndroidNDK(Native Development Kit)实际上属于JNI(Java Native Interface)的一部分,JNI就是允许Java代码和其他语言写的代码进行交互。Android基于Java平台,自然也是支持这个特征了,因...

76135
2012/07/15
1K
0
Android JNI MAC OS环境配置

Android JNI MAC OS环境配置 http://whbzju.github.io/blog/2013/06/01/android-jni-config/ JUN 1ST, 2013 | COMMENTS 前言—JNI技术简介 JNI是Java Native Interface的缩写,即“Java本地调......

whb_zju
2013/06/02
2.2K
0
学习——>JNI设置C++与java的结合

JNI是Java Native Interface的英文缩写, 中文翻译为本地调用, 自从Java 1.1开始就成为了Java标准的一部分. C/C++是系统级的编程语言, 可以用来开发任何和系统相关的程序和类库, 但是Java本身...

home-kevin
2014/01/07
589
0
windows平台开发,在eclipse中使用java如何调用.so文件,试了半天还是不行:

windows平台开发,在eclipse中使用java如何调用.so文件,试了半天还是不行: 1、java工程项目不是安卓项目,是web项目, 2、.so是linux下生成的动态库,.dll是windows下生成的动态库,网上几...

hhl3136
2017/11/21
2.6K
7

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
今天
4
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部