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库的更多相关文章

  1. Java调用Linux下的shell命令并将结果以流的形式返回

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...

  2. java调用dll或so动态库文件(c++/c)

    java调用dll或so动态库文件(c++/c) 博客分类:  工作 CC#C++JavaEclipse  java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CD ...

  3. linux下so动态库一些不为人知的秘密

    linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识.    基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些 ...

  4. linux下so动态库一些不为人知的秘密(中)

    上一篇(linux下so动态库一些不为人知的秘密(上))介绍了linux下so一些依赖问题,本篇将介绍linux的so路径搜索问题. 我们知道linux链接so有两种途径:显示和隐式.所谓显示就是程序 ...

  5. java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)

    java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...

  6. Java调用Linux命令(cd的处理)

    一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: public String executeLinuxCmd(String cmd) { System.out.print ...

  7. linux下的静态库和动态库

    一.linux下的静态库   静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在!   二.linux下动态库的构建和使用 1.动态库的构建   ...

  8. linux下的静态库和共享库

    转载&&增加:      我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期 ...

  9. Java调用Linux命令执行

    调用方式 Java调用linux命令执行的方式有两种,一种是直接调用linux命令,一种是将linux命令写到.sh脚本中,然后调用脚本执行. 详细说明 直接调用:使用java中lang包下面的Run ...

随机推荐

  1. CentOS6.5x64采用静默模式安装64位oracle11g

    1.下载oracle11g64位版本的源文件,并上传到Linux服务器,下载地址自行百度,若实在找不到请留言. 2.Package安装检查安装: 通过yum工具直接安装: yum -y install ...

  2. 基于VUE实现的h5网页Web出库单入库单打印设计

    经过将近一个月的研发,初步实现了打印单据的自定义设计,样子还有点丑陋,但是功能基本都实现了,实现了以下功能: 1.表头表尾支持动态添加行.添加列.合并单元格(可多行多列合并). 2.表头表尾分别布局, ...

  3. flask之session

    ''' session使用: session创建: (1)导入session from flask import session (2)设置secret_key密钥 app.secret_key='s ...

  4. Webconfig配置刷新时间,前台页面调用这个时间

    <configuration> <appSettings> <add key="webpages:Version" value="2.0.0 ...

  5. mysql 一台服务器中装两个mysql

    个人经验: 服务器中已有mysql5.0 现要安装mysql5.5 下载安装包,安装后,mysql5.5中没有my.ini文件,就在我自己的电脑上复制了mysql5.5的my.ini文件进去. 1.在 ...

  6. 求平均成绩(hdu2023)

    注意:要心细,不要错在小细节上.如int c[6];double agve; c[j]=agve:这是错误的. #include<stdio.h> #include<cmath> ...

  7. Python - 常用的PyCharm的快捷键和使用场景介绍

    关于PyCharm的快捷键,由于数量众多,差不多有100个,相信几乎没有人会记住所有,每个人都会有自己顺手的几个,这里我将自己用着顺手,不别扭的快捷键分享出来,同时分享在哪里可以找到所有的快捷键. 一 ...

  8. java--GC overhead limit exceeded--暂时修改JVM内存

    第一步:选择要运行的java文件->RunAs->Run Configurations 第二步:找到(x)=Arguments,在VM arguments中设置:-Xms最小运行内存 -X ...

  9. PHP数组简单操作

    1.数字索引数组 1.1创建一个数组 php中最常用的两个类型是:数组,字符串.数组也分为两种,一种是数字索引,一种是关键是索引,关键字索引有点像python中字典的意思.数字索引类型的数组的创建方法 ...

  10. C#不定长参数

    Test(5,6,7,8,9,10); void Test(int sd, params int[] arr)//不定长参数前要加params { for(int i = 0 ; i < arr ...