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
0 0
原创粉丝点击