动态链接库

Java调用动态链接库

浪子不回头ぞ 提交于 2019-12-26 20:30:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java调用动态链接库 JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。 1、 编写Java源文件-JavaCall.java 在MY_PATH目录下新建JavaCall.java文件,设置文件编码格式为UTF-8。文件内容,首先知名从java.library.path下指明将要调用的动态库的名字,其次声明将要调用的方法。 2、 编译Java源文件-JavaCall.class cd MY_PATH javac JavaCall.java 此时将在该目录下生成JavaCall.class文件 3、 生成JNI头文件-java*.h javah JavaCall 此时将在该目录下生成JavaCall.h文件,其内容如下图所示。 4、 编写C源文件-CallJNI.c 在MY_PATH目录下新建CallJNI.c文件,在该文件中编写相关函数实现上一步JavaCall

【腾讯Bugly干货分享】动态链接库加载原理及HotFix方案介绍

…衆ロ難τιáo~ 提交于 2019-12-06 22:45:53
本文来自于 腾讯bugly开发者社区 ,非经作者同意,请勿转载,原文地址: http://dev.qq.com/topic/57bec216d81f2415515d3e9c 作者:陈昱全 引言 随着项目中动态链接库越来越多,我们也遇到了很多奇怪的问题,比如只在某一种 OS 上会出现的 java.lang.UnsatisfiedLinkError ,但是明明我们动态库名称没错,ABI 也没错,方法也能对应的上,而且还只出现在某一些机型上,搞的我们百思不得其解。为了找到出现千奇百怪问题的原因,和能够提供一个方式来解决一些比较奇怪的动态库加载的问题,我发现了解一下 so 的加载流程是非常有必要的了,便于我们发现问题和解决问题,这就是本文的由来。 要想了解动态链接库是如何加载的,首先是查看动态链接库是怎么加载的,从我们日常调用的 System.loadLibrary 开始。 为了书写方便,后文中会用“so”来简单替代“动态链接库”概念。 1、动态链接库的加载流程 首先从宏观流程上来看,对于 load 过程我们分为 find&load,首先是要找到 so 所在的位置,然后才是 load 加载进内存,同时对于 dalvik 和 art 虚拟机来说,他们加载 so 的流程和方式也不尽相同,考虑到历史的进程我们分析 art 虚拟机的加载方式,先贴一张图看看 so 加载的大概流程。 我的疑问

使用vs2008制作dll文件,生成动态链接库

為{幸葍}努か 提交于 2019-12-04 20:53:35
1.制作dll文件 vs2008中,File > New Project > Other Language > Win32 > Win32 Console Application. 输入项目名称:MyDll。点击【OK】,【Next】,选择dll单选按钮,完成。 vs2008会自动生成一些代码,不用管它。创建MyDll.h,代码如下 MyDll.h 为了提高可用性,写了可回带值的函数供参考 Cpp代码 收藏代码 //MyDLL.h extern "C" _declspec(dllexport) int Max(int a, int b); extern "C" _declspec(dllexport) int Min(int a, int b); extern "C" _declspec(dllexport) bool cim2scada(char* cimId, char** scadaId); 创建MyDll.cpp Cpp代码 收藏代码 // MyDll.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" #include"MyDll.h" #include <iostream> int Max(int a, int b) { if(a>=b)return a

msvcr100.dll问题描述及修复方式

為{幸葍}努か 提交于 2019-12-01 10:45:46
出现问题的大部分原因是因该文件被木马病毒破坏导致系统找不到此文件,出现错误提示框,想要解决此问题只需找到专业的DLL文件下载网站,下载该文件,复制到相应目录。即可解决。 msvcr100.dll 为Visual Studio 2010的一个动态链接库,如果某程序是用它开发出来的,那么该程序的运行就有可能需要此动态链接库,有些程序直接将其打包到了安装目录,并注册,就不会出现缺失的问题;但有些程序则默认系统中有此动态链接库,没有进行处理,那就会出现缺失的问题。 修复方式 常规修复: 如果您的系统提示“没有找到找不到MSVCR100.dll”或者“MSVCR100.dll”等类似错误信息,请把MSVCR100.dll下载到本机。MSVCR100.dll有分32位和64位。 直接拷贝该文件到系统目录里: 1、如果下载的是32位 MSVCR100.dll ,系统也是32位,则复制到C:\Windows\System32目录下。如果是64位系统放到C:\Windows\SysWOW64。 2、如果下载的是64位 MSVCR100.dll ,系统是64位,则复制到C:\Windows\System32目录下。32位系统不兼容64位的MSVCR100.dll。 来源: oschina 链接: https://my.oschina.net/u/3197358/blog/1609020

msvcr100.dll丢失原因及解决方法

笑着哭i 提交于 2019-12-01 10:45:19
msvcr100.dll为Visual Studio 2010的一个动态链接库,如果某程序是用它开发出来的,那么该程序的运行就有可能需要此动态链接库。有些程序直接将其打包到了安装目录,并注册,就不会出现缺失的问题;但有些程序则默认系统中有此动态链接库,所以没有进行处理,因此就会出现缺失的问题 msvcr100.dll 是Visual Studio 2010的一个动态链接库,如果某程序是用它开发出来的,那么该程序的运行就有可能需要此动态链接库,有些程序直接将其打包到了安装目录,并注册,就不会出现缺失的问题;但有些程序则默认系统中有此动态链接库,没有进行处理,那就会出现缺失的问题。那么msvcr100.dll丢失的原因是什么呢? msvcr100.dll丢失原因:丢失msvcr100.dll文件是不少单机游戏尤其是绿色免安装版的游戏,常见问题, msvcr100.dll 为巫师2等游戏中常出现提示缺少的文件,缺少后无法启动游戏。或者是该文件被木马病毒破坏导致系统找不到此文件,出现错误提示框。 如果您的系统提示“没有找到msvcr100.dll”或者“缺少msvcr100.dll”等类似错误信息,直接下载到本机。 来源: oschina 链接: https://my.oschina.net/u/3197358/blog/1609021

[开源世界]增强版的动态链接库接口导出框架

给你一囗甜甜゛ 提交于 2019-11-29 03:29:28
参考: 从自动导出动态链接库接口看C++的缺点 更新内容: 1.封装了gDllImportList变量,删除了DllImportAttribute.cpp文件。 2.封装了User32类的全局变量,删除了User32.cpp文件。 更新后的框架只需要一个 DllImportAttribute.h文件,导出函数的文件也只需要一个,减少了文件数量。 #pragma once #include <Windows.h> #include <list> using namespace std; /* * DllImportAttribute * 定义加载和卸载动态链接库的接口 */ class DllImportAttribute { public: // 加载动态链接库 virtual BOOL Init() = 0; // 卸载动态链接库 virtual BOOL Uninit() = 0; }; /* * DllImportList * 封装gDllImportList(全局)变量,避免使用cpp文件 */ class DllImportList { protected: static DllImportList* m_pInstance; public: static DllImportList* CreateInstance() { if (m_pInstance == NULL)

[开源世界]从自动导出动态链接库接口看C++的缺点

流过昼夜 提交于 2019-11-27 19:12:44
自动导出动态链接库接口在C++编程中绝对是一件烦人的事情,因为你不得不大量的重复以下几个步骤: 1.加载动态链接库 2.定义导出函数指针定义 3.定义导出函数指针变量 4.从动态链接库中导出函数 5.编写导出函数的封装函数 6.卸载动态链接库 有很多人试图将这个过程自动化,然而全部折戟沉沙。我认为终极原因在于动态链接库在导出函数的时候没有包含参数信息,而在使用的时候不得不将导出函数进行强制转型。 在C#中导出动态链接库的函数相比C++来说要简单的多: 1. 使用DllImportAttribute属性规定导出函数的文件路径、导出点、堆栈调用方式等 2.定义导出函数的C#函数原型 说简单是代码简单,不是实现过程简单。从表面上看,C#的这两部实现了C++的那6步,从原理上来看,C#仍然需要C++的那6步。C#的编译器把2、3、4、5的步骤封装了,在C#代码编译成中间语言的时候进行了展开。C#在定义导出函数的函数原型的时候需要做一件事,就是判断C#参数类型和C++参数类型的对应关系,为什么要特别注意这一点呢?就是因为C#在展开的时候需要准确的C++函数定义,否则调用过程中会出现错误。 Java中有一个能够调用本地动态链接库的组件——JNative,虽然我没有看过它具体是怎么实现的,但是从我了解到的只字片语中推断JNative参考了C#的实现过程并原模原样的复刻了一份—