您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: