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后缀名。
- Java 调用现有的在Solaris平台上的库文件
- 在DM6446的DVSDK13现有的平台上实现telnetd服务器
- 在Solaris上编译Ethereal的注意事项
- jdk在solaris上的安装方法
- Solaris在虚拟机上的安装过程
- gcc在solaris上安装的过程
- 在Linux/Solaris上,将c文件编译成dll文件的方法
- Java在Windows平台上调用进程不传参的问题解决办法
- 我在Solaris里的.profile文件
- [JNI学习]---调用现有的so库
- Android-ndk 调用现有的动态库
- Solaris上的Dmalloc
- Solaris平台的进程端口映射
- Java的Servlet调用服务器上的html文件直接在客户端打开
- 在Solaris上mount Linux NFS文件系统的问题
- 在Solaris上使用不需要密码的rlogin
- 在 Solaris OS 上运行 TIBCO Rendezvous 的最佳实践
- BFagent在Solaris上的安装和卸载
- C++ STL <map> 用法简介
- Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)”
- 【POJ2886】Who Gets the Most Candies?-线段树+反素数
- Oracle关于高速缓存区应用原理
- (转)Java泛型<? extends T>和<? super T>
- Java 调用现有的在Solaris平台上的库文件
- request.getScheme()+"://"+request.getServerName()+":"+request.getServerP
- sigaction 使用
- HttpClient使用详解 (如何上传文件到文件服务器)
- 递归思想总结
- CakePHP3.2 文件接口篇
- ACM187 快速查找素数
- 深入理解JVM内幕
- VB.net版机房收费-“未能添加对‘Factory’的引用”