Java JNI 调用 so 动态链接库
来源:互联网 发布:js new video 编辑:程序博客网 时间:2024/06/09 18:49
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
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语言动态链接库
- 动态规划入门问题
- 一幅图让你清晰记忆java数据类型
- JDBC - Statements, PreparedStatement and CallableStatement
- C#中Dictionary、ArrayList、Hashtable和Array的区别
- Spark学习笔记--01 Spark集群的安装
- Java JNI 调用 so 动态链接库
- 70. Climbing Stairs [easy] (Python)
- 怎样配置Linux下的vim编辑器
- Spring Boot 性能优化
- Android系统开发之系统默认值修改
- Gson使用的一些总结
- Javascript、Jquery获取浏览器和屏幕各种高度宽度
- js常用事件总结及案例-onChange
- 25. Reverse Nodes in k-Group