GVKun编程网logo

如何在Java中使用Linux共享库?(java连接linux)

8

针对如何在Java中使用Linux共享库?和java连接linux这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Linux下的C#能否调用.so共享库?、Linux共享库zlog日志、Li

针对如何在Java中使用Linux共享库?java连接linux这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Linux 下的 C# 能否调用 .so 共享库?、Linux共享库 zlog日志、Linux共享库c、Linux共享库两种加载方式简述等相关知识,希望可以帮助到你。

本文目录一览:

如何在Java中使用Linux共享库?(java连接linux)

如何在Java中使用Linux共享库?(java连接linux)

有什么方法可以so从Java代码中调用库中的函数吗?通常,可以so在Java程序中使用Linux 库吗?

答案1

小编典典

答案是“ JNI” :)

这里有几个链接:

  • 如何在Linux上为JNI应用程序编译动态库?

  • http://learn-from-the-guru.blogspot.com/2007/12/java-native-interface-jni-tutorial-hell.html

  • http://docs.oracle.com/javase/6/docs/technotes/guides/jni/

Linux 下的 C# 能否调用 .so 共享库?

Linux 下的 C# 能否调用 .so 共享库?

如题,我用的是 Mono 在 Linux 下开发 C# 应用,想调用一些 so 库文件,有什么具体的思路吗?

Linux共享库 zlog日志

Linux共享库 zlog日志

[ global]
strict init    = false
buffer min = 1024
buffer max = 2MB    
rotate lock file=        /tmp/zlog.lock
[formats]
normal = "%d.%us [%V][%F:%L] %m%n"
[ rules ]
asr_level.*        "/home/test/asr.log";normal

注意:如果配置了rotate lock file项,在自己本机测试时候,注意删除一下zlog.lock文件,不然有可能锁住,导致zlog初始化失败

zlog参数配置详解
[formats]
%d    --表示时间,例如 2018-07-20 09:32:43
%us   --表示微妙,例如 991437
%F    --表示文件,例如 test_init.c
%V    --表示日志等级,例如 DEBUG,INFO
%L    --表示行号
%m    --表示用户输出信息
%n    --表示换行

normal = "%d.%us [%V][%F:%L] %m%n"

[rules]
类别名.*          --表示打印所有级别的日志信息
类别名.=DEBUG     --表示打印指定级别的日志
类别名.!DEBUG     --表示打印非DEBUG级别的日志
#ifndef __ASR_ZLOG_H_
#define __ASR_ZLOG_H_

#include "zlog.h"

/*日志类*/

extern zlog_category_t *zc;

//初始化zlog
int zlogInit(const char *pcConfigPath, const char *pcModelName);

//释放zlog
void zlogDestory();

#define FATAL_LOG(fmt,...) \
    zlog_fatal(zc,fmt,__VA_ARGS__);

#define ERROR_LOG(fmt,...) \
    zlog_error(zc,fmt,__VA_ARGS__);

#define WARN_LOG(fmt,...) \
    zlog_warn(zc,fmt,__VA_ARGS__);

#define NOTICE_LOG(fmt,...) \
    zlog_notice(zc,fmt,__VA_ARGS__);

#define INFO_LOG(fmt,...) \
    zlog_info(zc,fmt,__VA_ARGS__);

#define DEBUG_LOG(fmt,...) \
    zlog_debug(zc,fmt,__VA_ARGS__);

#endif
#include <stdarg.h>

#include "asr_log.h"
#include "comontype.h"

zlog_category_t *zc;


/********************************************************
zlog
*********************************************************/

/********************************************************
   Func Name: init
Date Created: 2018-7-20
 Description: 初始化
       Input: 
      Output: 
      Return: error code
     Caution: 
*********************************************************/
int zlogInit(IN const char *pcConfigPath,IN const char *pcModelName)
{
    int iRet = DEFAULT_ERROR;
    
    if (NULL == pcConfigPath || NULL == pcModelName)
    {
        iRet = PARAM_ERROR;
        return iRet;
    }

    iRet = zlog_init(pcConfigPath);
    if (iRet) {
        printf("init fail");
        return DEFAULT_ERROR;
    }
    zc = zlog_get_category(pcModelName);
    if (!zc) {
        printf("zlog_get_category fail\n");
        zlog_fini();
        return DEFAULT_ERROR;
    }

    return RESULT_OK;
}

/********************************************************
   Func Name: init
Date Created: 2018-7-20
 Description: 销毁zlog
       Input: 
      Output: 
      Return: 
     Caution: 
*********************************************************/
void zlogDestory()
{
    zlog_fini();
}

 

Linux共享库c

Linux共享库c

我有一个明智的共享图书馆.我如何在我的程序中使用它?我是否需要包含该库的标题?

我在Linux下使用Eclipce.我使用-L和-l设置了库的路径.但我的功能在程序中不可见.

你能解释一下共享图书馆是如何运作的吗?

问候.

编辑:

我收到以下错误:

int main() {
    char* path = "/export/home/pdmazubi3/workspace/proj1/src/pic.jpg";
    CEDD_Descriptor::CEDD ced; // undefined reference to `CEDD_Descriptor::CEDD::CEDD[in-charge]()'
    ced.execute(path);
}

标题:

class CEDD
    {
        public:
            CEDD(double Th0,double Th1,double Th2,double Th3,bool CompactDescriptor);
            CEDD();
            ~CEDD(void);

            double T0;
            double T1;
            double T2;
            double T3;
            bool Compact;

            double* execute(char* path);

        private:
            int cedd_segnum;                //number of segments
            int* cedd_partitionSize;        //number of pixels in each segment
    };

解决方法

您需要在应用程序中包含头文件并链接它.

看看如何在shared libraries和Linux howto中使用库.

如果头文件与您的应用程序不在同一目录中(通常不是),那么您需要告诉编译器在哪里查找它,使用-I / path / to / include来包含包含目录的路径包含头文件.

在链接步骤中,您需要指向库.一般用法是使用-L / path / to / lib是包含库的目录的路径,后跟-l< libname>其中< libname>是没有lib的库的名称,例如如果你有libboost_serialization-d-1_34_1.so你会使用-lboost_serialization-d-1_34_1

例子:

g++ -I/sw/include -Wall -g -I/usr/local/include/boost-1_36/ -c main.cpp -o main.o
g++ -L/sw/lib -lboost_serialization-d-1_34_1 -o x main.o

Linux共享库两种加载方式简述

Linux共享库两种加载方式简述

     动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易。与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是在程序执行时按需载入,其执行代码可以同时在多个程序中共享。由于在编译过程中无法知道动态库函数的地址,所以需要在运行期间查找,这对程 序的性能会有影响。

 

共享库 

     对于共享库来讲,它只包括2个段:只读的代码段 和可修改的数据段。堆和栈段,只有进程才有。如果你在共享库的函数里,分配了一块内存,这段内存将被算在调用该函数的进程的堆中。代码段由于其内容是对每 个进程都是一样的,所以它在系统中是唯一的,系统只为其分配一块内存,多个进程之间共享。数据段由于其内容对每个进程是不一样的,所以在链接到进程空间 后,系统会为每个进程创建相应的数据段。也就是说如果一个共享库被N个进程链接,当这N个进程同时运行时,同时共享一个代码段,每个进程拥有一个数据段,系统中共有N个数据段。PICposition independent code,使.so文件的代码段变为真正意义上的共享。如果编译时不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy。

 

加载方式

     1. 静态加载

 

     在程序编译的时候加上-l”选项,指定其所依赖的动态库,这个库的名字将记录在ELF文件的.dynamic节。在程序运行时,loader会预先将程序所依赖的所有动态库都加载在进程空间中。

     优点:动态库的接口调用简单,可以直接调用。

     缺点:动态库的生存周期等于进程的生存周期,其加载时机不灵活。

 

     2. 动态加载

     在程序中编码来指定加载动态库的时机,经常使用的函数dlopen和dlclose

     优点:动态库加载的时机非常灵活,可以非常细致的定义动态库的生存周期。

     缺点动态库的接口调用起来比较麻烦,同时还要关注动态库的生存周期。

=====================================================

      #include <dlfcn.h>

  void * dlopen( const char * pathname, int mode );

  函数描述:

  在dlopen的()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。

  mode:分为这两种

  RTLD_LAZY 暂缓决定,等有需要时再解出符号

  RTLD_NOW 立即决定,返回前解除所有未决定的符号。

  RTLD_LOCAL  不允许导出符号

  RTLD_GLOBAL 允许导出符号

  RTLD_NODELETE

      RTLD_NOLOAD

      RTLD_DEEPBIND          //具体含义可通过man查看dlopen函数说明

  返回值:

  打开错误返回NULL

  成功,返回库引用

  编译时候要加入 -ldl (指定dl库)

 

  int dlclose (void *handle);

 

  函数描述:

   dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。

 

 

     在dlopen一个共享库时,

a、进程会加载该共享库的代码段和数据段,同时为这个共享库计数加1

b、进程查找该共享库的dynamic节,查看其所依赖的共享库。

c、首先检查所依赖库是否已经被加载,如果已被加载,则为这个共享库计数加1。如果未被加载,则加载其代码段和数据段,然后为这个共享库计数加1

d、再查找这些库所依赖的库。最终进程会为每个加载的共享库维护一个依赖的计数。

 

     在dlclose共享库时:

a、首先将该共享库的计数减1,如果该共享库依赖计数为0,则卸载该共享库。

b、在dynamic节中,查找其所依赖的共享库。

c、为每个共享库的计数减1,如果该共享库依赖计数为0,则卸载该共享库。

d、重复上面的步骤。

  • 优点:

a、可以在程序启动的时候,减少加载库的数量,这样可以加快进程的启动速度和减少加载库的内存使用。

b、为进程提供了卸载共享库的机会,这样就可以回收共享库代码段和数据段所占用的内存。

  • 缺点:

对于程序员编码来讲,会产生一定的疑惑。一个static的对象的生存周期是贯穿在进程始终的,实际上不是这样。在动态库中的static对象,其生命周期等于该动态库的生命周期。采用静态链接的方式,动态库的生命周期等于进程的生命周期;而采用动态加载的方式,则是不同的。

 

参考:

《嵌入式Linux内存与性能详解》

 

关于如何在Java中使用Linux共享库?java连接linux的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Linux 下的 C# 能否调用 .so 共享库?、Linux共享库 zlog日志、Linux共享库c、Linux共享库两种加载方式简述等相关内容,可以在本站寻找。

本文标签: