Java JNI 调用 so 动态链接库
2016-05-26 13:10
176 查看
Java JNI 调用 so 动态链接库
=================================
1.编写java代码
package com.cyjch;
public class Hello{
public native static int add(int x,int y); //java 代码中声明 native 方法
static {
System.load("/xxx/cyjch.so"); //以绝对路径加载so文件
}
public static void main(String[] args){
System.out.println(add(1,1));
}
}
2.编译java代码
javac -d . Hello.java
命令解释: -d:表示生成目录,生成的目录以package的定义为准; .:表示在当前所在文件夹中生成
3.编写C代码,首先生成 .h 头文件
javah com.cyjch.Hello
4.查看生成的com_cyjch_Hello.h
[root@iZ257741243Z xxx]# cat com_cyjch_Hello.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_cyjch_Hello */
#ifndef _Included_com_cyjch_Hello
#define _Included_com_cyjch_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_cyjch_Hello
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_cyjch_Hello_add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
5.编写实现 add 方法的 C 代码
Hello.c
#include<stdio.h>
#include "com_cyjch_Hello.h"
JNIEXPORT jint JNICALL Java_com_cyjch_Hello_add(JNIEnv *env, jclass jc, jint x, jint y){
return x+y; //简单的加法
}
6.编译运行,生成Hello.o
gcc -fPIC -D_REENTRANT -I/opt/soft/jdk1.7/include -I/opt/soft/jdk1.7/include/linux -c Hello.c
7.生成 cyjch.so 库
gcc Hello.o -o cyjch.so -shared
8.运行java类
java com.cyjch.Hello
* 反向开发:
如果提供了 so 文件,而我们必须通过编写 java 代码调用,则我们需要知道 java 中的 package 的路径,java 中方法的声明
Java JNI 调用 so 动态链接库
=================================
1.将so文件放到jdk目录中
/opt/soft/jdk1.7/jre/lib/amd64/libqrkey-x64-150907-lbjy.so
2.配置so文件路径:source /etc/profile
#so路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/soft/jdk1.7/jre/lib/amd64/libqrkey-x64-150907-lbjy.so:/opt/soft/jdk1.7/jre/lib/amd64
3.配置jna.jar路径
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/jna-3.3.0.jar
4.写java Qrkey.java
import com.sun.jna.Library;
import com.sun.jna.Native;
public class Qrkey {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("libqrkey-x64-150907-lbjy", CLibrary.class);
public int make_customer_card(String input, byte[] output, byte[] cardno);
}
public static void main(String[] args) {
String input = "05600100100101015090812001509081200150908150015090815001234567887654321";
byte[] charOutput = new byte[68];
byte[] charCardNo = new byte[8];
int result = CLibrary.INSTANCE.make_customer_card(input, charOutput, charCardNo);
System.out.println(result);
System.out.println(new String(charOutput));
System.out.println(new String(charCardNo));
}
}
5.编译类并执行
1)带jar包的执行
java -Dfile.encoding=utf8 -cp .:./jna-4.1.0.jar Qrkey
2)常规执行
java Qrkey
jna包
https://github.com/java-native-access/jna/blob/master/www/GettingStarted.md
jna用法
http://blog.sina.com.cn/s/blog_632bb1950100o7zd.html http://blog.csdn.net/lsh6688/article/details/17616487
=================================
1.编写java代码
package com.cyjch;
public class Hello{
public native static int add(int x,int y); //java 代码中声明 native 方法
static {
System.load("/xxx/cyjch.so"); //以绝对路径加载so文件
}
public static void main(String[] args){
System.out.println(add(1,1));
}
}
2.编译java代码
javac -d . Hello.java
命令解释: -d:表示生成目录,生成的目录以package的定义为准; .:表示在当前所在文件夹中生成
3.编写C代码,首先生成 .h 头文件
javah com.cyjch.Hello
4.查看生成的com_cyjch_Hello.h
[root@iZ257741243Z xxx]# cat com_cyjch_Hello.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_cyjch_Hello */
#ifndef _Included_com_cyjch_Hello
#define _Included_com_cyjch_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_cyjch_Hello
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_cyjch_Hello_add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
5.编写实现 add 方法的 C 代码
Hello.c
#include<stdio.h>
#include "com_cyjch_Hello.h"
JNIEXPORT jint JNICALL Java_com_cyjch_Hello_add(JNIEnv *env, jclass jc, jint x, jint y){
return x+y; //简单的加法
}
6.编译运行,生成Hello.o
gcc -fPIC -D_REENTRANT -I/opt/soft/jdk1.7/include -I/opt/soft/jdk1.7/include/linux -c Hello.c
7.生成 cyjch.so 库
gcc Hello.o -o cyjch.so -shared
8.运行java类
java com.cyjch.Hello
* 反向开发:
如果提供了 so 文件,而我们必须通过编写 java 代码调用,则我们需要知道 java 中的 package 的路径,java 中方法的声明
Java JNI 调用 so 动态链接库
=================================
1.将so文件放到jdk目录中
/opt/soft/jdk1.7/jre/lib/amd64/libqrkey-x64-150907-lbjy.so
2.配置so文件路径:source /etc/profile
#so路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/soft/jdk1.7/jre/lib/amd64/libqrkey-x64-150907-lbjy.so:/opt/soft/jdk1.7/jre/lib/amd64
3.配置jna.jar路径
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/jna-3.3.0.jar
4.写java Qrkey.java
import com.sun.jna.Library;
import com.sun.jna.Native;
public class Qrkey {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("libqrkey-x64-150907-lbjy", CLibrary.class);
public int make_customer_card(String input, byte[] output, byte[] cardno);
}
public static void main(String[] args) {
String input = "05600100100101015090812001509081200150908150015090815001234567887654321";
byte[] charOutput = new byte[68];
byte[] charCardNo = new byte[8];
int result = CLibrary.INSTANCE.make_customer_card(input, charOutput, charCardNo);
System.out.println(result);
System.out.println(new String(charOutput));
System.out.println(new String(charCardNo));
}
}
5.编译类并执行
1)带jar包的执行
java -Dfile.encoding=utf8 -cp .:./jna-4.1.0.jar Qrkey
2)常规执行
java Qrkey
jna包
https://github.com/java-native-access/jna/blob/master/www/GettingStarted.md
jna用法
http://blog.sina.com.cn/s/blog_632bb1950100o7zd.html http://blog.csdn.net/lsh6688/article/details/17616487
相关文章推荐
- 《矩阵》——稀疏矩阵(Java)
- Java Swing的进化
- Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
- 桥接模式(Bridge)-Java
- Eclipse安装LaTex插件TeXlipse
- 根据日期得到星座
- MyEclipse 2014 Maven4MyEclipse 新建导入maven项目
- 为什么Java匿名内部类的方法中用到的局部变量都必须定义为final
- RSA基于Java Web的前台公钥加密后台私钥解密
- Struts2文件上传
- JAVA垃圾回收机制
- MyEclipse2015 Stable2.0 安装与破解
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- 基于Struts2大文件分片断点续传
- java jdk 1.6 下载
- Binder源码分析之Java层
- java process.waitfor 返回1 解决
- 【JAVA框架】Hibernate 与Mybatis 区别
- 使用Spring MVC 配置
- 由java.lang.NoClassDefFoundError: List错误引发的jdk配置