java调用linux下的so库
1.编写java类
public class Abc {
static {
System.loadLibrary("abc");
}
public native static String getAbc();
public static void main(String s[]) {
System.out.println(getAbc());
}
}
终端执行: java Abc.java
再执行:javah Abc 生成Abc.h文件
生成Abc.h的头文件,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include </usr/local/jdk1..0_201/include/jni.h>
/* Header for class Abc */ #ifndef _Included_Abc
#define _Included_Abc
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Abc
* Method: getAbc
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Abc_getAbc
(JNIEnv *, jclass); #ifdef __cplusplus
}
#endif
#endif
编写C文件:
#include <stdio.h>
#include "Abc.h" JNIEXPORT jstring JNICALL Java_Abc_getAbc(JNIEnv *env, jclass t2)
{
char *ptr = "hello world"; jstring str ;
str = (*env)->NewStringUTF(env, ptr); return str;
}
生成动态库:gcc test.c -fPIC -shared -o libabc.so
将动态库拷贝至: cp libabc.so /usr/local/jdk1.8.0_201/jre/lib/amd64/
然后终端运行 java Abc
[root@sec javatest]# javac Abc.java
[root@sec javatest]# java Abc
hello world
至此 java调用linux下动态库成功
//测试jstring转char*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Abc.h" JNIEXPORT jstring JNICALL Java_Abc_getAbc
(JNIEnv *env, jclass t)
{
char ptr[] = "hello xxx world"; jstring str ;
str = (*env)->NewStringUTF(env, ptr);
return str;
} /*
* Class: Abc
* Method: setBuf
* Signature: (Ljava/lang/String;)V
*/ char* jstringtochar( JNIEnv *env, jstring jstr )
{
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env,"java/lang/String");
jstring strencode = (*env)->NewStringUTF(env,"utf-8");
jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr, mid, strencode);
jsize alen = (*env)->GetArrayLength(env,barr);
jbyte* ba = (*env)->GetByteArrayElements(env,barr, JNI_FALSE);
if (alen > )
{
rtn = (char*)malloc(alen + );
memcpy(rtn, ba, alen);
rtn[alen] = ;
}
(*env)->ReleaseByteArrayElements(env,barr, ba, );
return rtn;
} JNIEXPORT void JNICALL Java_Abc_setBuf
(JNIEnv *env, jclass t, jstring dev)
{
// jstring 转 char*
//dev1 = ReleaseStringUTFChars(env, dev); char * rtn = NULL;
rtn = jstringtochar(env, dev); printf("[%s]\n", rtn); } JNIEXPORT void JNICALL Java_Abc_setBuf2
(JNIEnv *env, jclass t, jint num)
{
printf("%d\n", num);
}
java调用linux下的so库的更多相关文章
- Java调用Linux下的shell命令并将结果以流的形式返回
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...
- java调用dll或so动态库文件(c++/c)
java调用dll或so动态库文件(c++/c) 博客分类: 工作 CC#C++JavaEclipse java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CD ...
- linux下so动态库一些不为人知的秘密
linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识. 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些 ...
- linux下so动态库一些不为人知的秘密(中)
上一篇(linux下so动态库一些不为人知的秘密(上))介绍了linux下so一些依赖问题,本篇将介绍linux的so路径搜索问题. 我们知道linux链接so有两种途径:显示和隐式.所谓显示就是程序 ...
- java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)
java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...
- Java调用Linux命令(cd的处理)
一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: public String executeLinuxCmd(String cmd) { System.out.print ...
- linux下的静态库和动态库
一.linux下的静态库 静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在! 二.linux下动态库的构建和使用 1.动态库的构建 ...
- linux下的静态库和共享库
转载&&增加: 我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期 ...
- Java调用Linux命令执行
调用方式 Java调用linux命令执行的方式有两种,一种是直接调用linux命令,一种是将linux命令写到.sh脚本中,然后调用脚本执行. 详细说明 直接调用:使用java中lang包下面的Run ...
随机推荐
- jQuery学习笔记——jQuery基础核心
代码风格 在jQuery程序中,不管是页面元素的选择.内置的功能函数,都是美元符号“$”来起始的.而这个“$”就是jQuery当中最重要且独有的对象:jQuery对象,所以我们在页面元素选择或执行功能 ...
- 2018-06-18 sublime代码编辑器
sublime代码编辑器:主流前端开发编辑器,体积较小,运行速度快,文本功能强大,支持VI扩展,linux下面有个自带的文本编辑神器,名字叫做:vi ,熟练vi模式可以大量减少使用鼠标的次数,从而增加 ...
- Spring全家桶之springMVC(四)
路径变量PathVariable PathVariable Controller除了可以接收表单提交的数据之外,还可以获取url中携带的变量,即路径变量,此时需要使用@PathVariable ...
- Ubuntu下解决中文显示为方块最佳方法
一.问题分析 由于Linux系统中并没有包含中文相关的字体库,而不是系统不支持中文或者中文乱码,因此显示给我们的是方块儿 二.解决方法 1.从window系统中的字体库复制需要的中文库到Linux系统 ...
- mysql5.6 thread pool
从percona 的压测来看,确实很牛笔啊.提升很大. http://www.mysqlperformanceblog.com/2014/01/29/percona-server-thread-poo ...
- 【雕爷学编程】Arduino动手做(49)---有源蜂鸣器模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...
- CF948B Primal Sport
题目链接:http://codeforces.com/contest/948/problem/B 知识点: 素数 解题思路: \(f(x)\) 表示 \(x\) 的最大素因子.不难想到:\(X_1 \ ...
- 【MySQL】剖析MySQL读写分离技术
主从技术的一个基本流程图: 如何实现主从复制的呢: MySQL Master(主节点) 1>当一个请求来时,首先由[mysqld]写入到我们的主[data]中 2>然后[mysqld]将 ...
- Java集合(九)哈希冲突及解决哈希冲突的4种方式
Java集合(九)哈希冲突及解决哈希冲突的4种方式 一.哈希冲突 (一).产生的原因 哈希是通过对数据进行再压缩,提高效率的一种解决方法.但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致 ...
- 用Python做词云可视化带你分析海贼王、火影和死神三大经典动漫
对于动漫爱好者来说,海贼王.火影.死神三大动漫神作你肯定肯定不陌生了.小编身边很多的同事仍然深爱着这些经典神作,可见"中毒"至深.今天小编利用Python大法带大家分析一下这些神作 ...