Java 调用现有的在Solaris平台上的库文件

来源:互联网 发布:ubuntu进程查看 编辑:程序博客网 时间:2024/06/08 02:08

现在网络上有比较多的java使用JNI调用C/C++ 的使用方法,大部分都是大同小异,大部分都是下面的步骤1,2,3步.
1.先是写普通的Java类,静态的加载库文件,编写需要调用的本地方法调用。
2.然后编译这个Java类,调用javah命令,生成.h头文。
3.接着写一个C文件,实现上面生成的.h文件的函数;
But, 在很多的现实开发场景中,并不是如上面的场景,底层的C/C++ 已经编译完成,并且生成了动态的库文件,这个时候使用上面的方法就感觉差了一步,下面我来介绍一下,在现有存在的动态库的情况下怎么调用Native方法。

接着上面的步骤来:
前两个步骤省略,从第三步讲起:
我们实际在写第三步的时候,编写的C文件,就是JNI语言(胶水语言),里面具体的语法和类型转换资料有大把。
4. 假设你有一个现有的库,名字叫做libtest.so 文件,这个SO文件有一个Test.h的头文件,里面定义了一个go函数,然后我们需要调用这个go函数计算一下数值,下面是JNI的实现。

#include <jni.h>#include "MyJNI.h" // 这个是有javah生成的头文件#include "Test.h" // 这是外部So文件的头文件名称#include<stdio.h>  /*  * Class:     MyJNI  * Method:    go  * Signature: ()V */ //Mark: 里面的有一些全局变量是我这套系统里面的定义的,大家可以忽略这些东西,关键是理解怎么做就好JNIEXPORT void JNICALL Java_MyJNI_go  (JNIEnv * env, jobject jobj,jint type, jstring cal, jlong date){STATCODE status;int err_code;char calendar[5];int len;DtDATE settle_date;/*convert jstring to native string*/len = (*env) ->GetStringLength(env,cal);(*env)-> GetStringUTFRegion(env, cal, 0, len, calendar);status = go(type, calendar, date, &settle_date, &err_code);//后面两个是返回值if(status == CcSUCCESS){   return settle_date;}else{   print("Natvie call error for method go");   return -1;}}

5.写好之后我们需要编译这个C文件,并且得到另外一个中间的So文件。
这个SO文件需要写到java的静态代码块中,而且这个SO文件依赖于刚才提到的外部库文件。
以下是编译命令:
CC -G -I/用户当前系统的java home 路径/include -I/java home/include/solaris -I/外部库文件的头文件路径/ -L /外部库文件的路径/ -ltest testJni.c -o helloWorld.so

Mark:由于当前使用的是Solaris. 当前的库文件名称为libtest.so,使用“-ltest”时,会忽略前面的lib和后面的.so后缀名。

0 0