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下有效...

9.在运行HelloJNI.class

java net.wangliping.HelloJNI

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

遇到问题:

1. JNI调用本地SO库失败

解决方法:设置export LD_LIBRARY_PATH=/home/dev就好了

Linux平台Java调用so库-JNI使用例子相关推荐

  1. linux java调用so文件路径_Linux平台Java调用so库-JNI使用例子

    1.确保gcc编译器已安装 2.编写HelloJNI.java代码,用native声明需要用C实现的函数. 如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/home/swan/ ...

  2. 利用JNative实现Java调用动态库

    由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在sourceforge.net上搜索了一下 "Java dll",首先出现的是 ...

  3. Java调用动态库 缺点,Java调用动态库所需要关心的有关问题

    Java调用动态库所需要关心的问题 标签: 无标签 利用JNative实现Java调用动态库(转) http://cctv663.blog.163.com/blog/static/1011921220 ...

  4. Java调用c/c++(JNI)最详细步骤

    一.JNI(Java Native Interface)的作用就是Java通过JNI调用其他语言的函数(或方法)(主要是C&C++). 二.准备 1. java8系列jdk,有很多版本,任选一 ...

  5. linux平台 加载动态库dlsym返回null

    linux 平台加载动态库通常使用dlopen,dlsym,dlclose三个函数实现 最近写了一个小程序,遇到dlsym总是调用失败返回空值,查找了很多相关的资料,确定动态库的创建有问题.下面是最初 ...

  6. linux下java调用matlab程序,linux_java调用windows_matlab程序

    0 说明 本文为研究java和matlab的混合编程,进行了详细的测试和探索,以解决linux环境下java程序调用matlab程序的一个应用. linux端的环境 :(运行java程序并调用wind ...

  7. boost linux 测试程序,Linux平台下安装 boost 库

    Linux平台下安装boost库 今天在给师弟们设计新一代软件框架的时候,需要实现一种功能:存在一种容器,里面存放着不同的数据类型,例如int, double, char,以及一些自己定义的类等等.后 ...

  8. Java调用动态库(转载)

    记得以前 Java 要调用C/C++写得动态库都是用的 JNI 方式,还需要自己写不少 C/C++ 代码.比如说要在Java中调用已有的动态库,如 Windows 的 user32.dll 的方法 M ...

  9. java调用so库中的native方法_Java如何调用本地.so库里的方法

    首先在此之前希望你已经掌握了基本JNI常识的运用,比如Java代码如何调用本地native的方法,native方法如何访问本地变量,本地方法等以及其他相关的基础知识.在此我还是贴上Activity的部 ...

最新文章

  1. 背景建模与前景检测1(Background Generation And Foreground Detection)
  2. Python学习笔记(基础知识点二)开更了~
  3. 深度学习论文翻译--Deep Residual Learning for Image Recognition
  4. Python中装饰器的理解和实现
  5. 线程间通信: Handler , Looper, MessageQueue, Message (完结)
  6. Steeltoe 2.4新增代码生成工具、全新入门指南等,助力.NET微服务开发
  7. 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理
  8. Redis教程:数据库
  9. php 表单数据的获取代码,php 表单数据的获取代码
  10. CENTOS6 安装和使用PHP全链路追踪 Molten
  11. 一文了解 TKG 如何使用 GPU 资源池
  12. java判断excel格式_Java 设置Excel数据验证
  13. AK/SK(aksk)鉴权原理简介
  14. 数据库技术在项目中的应用?
  15. python爱好者社区公众号历史文章合集_精心整理 |人工智能爱好者社区历史文章合集(作者篇)...
  16. 完成知乎项目的登录和注册功能(二)
  17. VM打开虚拟机蓝屏重启怎么办
  18. 【移动终端应用开发】实验1:SharedPreferences的应用
  19. Vivado与Modelism、VScode联合使用
  20. 【Shell脚本进阶】从此彻底搞懂 Linux 环境变量及 Shell 启动文件 /etc/profile 、 ~/.bash_profile 和 ~/.bashrc(建议收藏)

热门文章

  1. reporting services 导出pdf格式优化
  2. 遍历页面上的所有控件
  3. 局域网共享问题解决方法!
  4. IT人为了自己父母和家庭,更得注意自己的身体和心理健康
  5. JavaScript系列文章:自动类型转换
  6. JavaScript 的同源策略
  7. 基于TCP(面向连接)的Socket编程
  8. 项目中用到的三个绿色自动备份方法
  9. WebLogic RCE(CVE-2019-2725)漏洞之旅
  10. 【网络】高性能网络编程--下一个10年,是时候考虑C10M并发问题了