Java JNI 调用 so 动态链接库
来源:互联网 发布:矩阵奇异值与特征值 编辑:程序博客网 时间:2024/06/09 20:19
实现一个最简单的 JNI 调用
编写 Java 代码
package sf.gg;public class Hello{public native static int add(int x,int y); //java 代码中声明 native 方法static { System.load("/home/lance/main.so"); //以绝对路径加载so文件 }public static void main(String[] args){ System.out.println(add(1,1)); }}
编译 java 代码 javac -d . Hello.java
命令解释: -d:表示生成目录,生成的目录以package的定义为准;
.:表示在当前所在文件夹中生成
查看生成的文件和目录
ls -al
编写C代码
首先生成.h
头文件
javah sf.gg.Hello
查看生成的 sf_gg_Hello.h
文件
vim sf_gg_Hello.h
如下:
/* DO NOT EDIT THIS FILE - it is machine generated *//* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class sf_gg_Hello */#ifndef _Included_sf_gg_Hello#define _Included_sf_gg_Hello#ifdef __cplusplusextern "C" {#endif/* * Class: sf_gg_Hello * Method: add * Signature: (II)I */JNIEXPORT jint JNICALL Java_sf_gg_Hello_add (JNIEnv *, jclass, jint, jint);#ifdef __cplusplus}#endif#endif
编写实现add
方法的 C 代码
vim hello.c
代码如下:
#include<stdio.h>#include "sf_gg_Hello.h"JNIEXPORT jint JNICALL Java_sf_gg_Hello_add(JNIEnv *env, jclass jc, jint x, jint y){ return x+y; //简单的加法}
编译运行
OS: ubuntu 14.04 lts
gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-8-oracle/include -I/usr/lib/jvm/java-8-oracle/include/linux -c hello.c
命令解释: man gcc
注意:需要命令中的/usr/lib/jvm/java-8-oracle/include
需要换成本机的 jdk 对应的目录
生成 so 库
gcc hello.o -o main.so -shared
查看生成的文件
ls -al
运行
java sf.gg.Hello
总结
编写带有native声明的方法的Java类
使用javac命令编译编写的Java类
使用javah ...来生成后缀名为.h的头文件
使用其他语言(C、C++)实现本地方法
将本地方法编写的文件生成动态链接库
补充
如果以其他方式调用,出现no dll或so in java.library.path
,参考此文:JAVA WEB项目加载dll文件失败,no xxx in java.library.path
输出系统 java.library.path
public class PrintPath{ public static void main(String[] args){ System.out.println(System.getProperty("java.library.path"));}}
其它相关资料参考:
System.load 和 System.loadLibrary详解 1
System.load 和 System.loadLibrary详解 2
linux/Ubuntu 下使用 java 调用 so 动态链接库详细步骤
0 0
- Java JNI 调用 so 动态链接库
- Java JNI 调用 so 动态链接库
- Java JNI调用so动态链接库
- java jni 调用.so动态库
- Android studio通过JNI调用动态链接库SO
- java调用so动态链接库
- JNI java调用动态链接库dll
- JNI调用动态库.so
- 调用动态链接库*.so
- Java jni 动态库 so
- 【JNI调用DLL动态库】Java使用JNI调用DLL动态链接库学习记录
- Linux JNI调用so动态库示例
- Android studio下的Android JNI调用以及动态链接库.so的生成
- AndroidStudio配置NDK/JNI,完成so动态链接库的调用
- linux下 java JNI调用C语言动态链接库
- linux下 java JNI调用C语言动态链接库
- 浅谈JNI的使用-java调用动态链接库
- linux下 java JNI调用C语言动态链接库
- 解决URL中添加的jsessionid
- 怀着感恩的心生存
- java File 的getPath getAbsolutePath和getCanonicalPath的不同
- OpenStack-01
- MySQL处理数据库和表的常用命令
- Java JNI 调用 so 动态链接库
- Extjs5需要引入哪些文件
- Java 数组
- MySQL主从复制架构搭建及读写分离测试
- Java 集合框架
- 北美股市反向ETF和杠杆ETF列表
- 优化网站设计(二十一):尽量少用iframe
- 学习vi和vim编辑器(10):高级编辑方法(1)
- 创建PhoneGap项目