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

现在网络上有比较多的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后缀名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值