自己实现的第一个linux中dll的调用
1. 编译dll:
g++ -shared -lc -o strcase.dll lowcase.cpp uppercase.cpp
如果要加入调试信息:(加上 -g选项)
g++ -shared -lc -o strcase.dll lowcase.cpp uppercase.cpp -g
编译c++ dll注意函数之前需要加上 extern "C",否则在dlsym函数调用的时候可能会找不到函数
.
2. 编译exe:
g++ -ldl -o strcase.exe main.cpp
如果要加入调试信息:(加上 -g选项)
g++ -ldl -o strcase.exe main.cpp -g
3. gdb调试
gdb strcase.exe
调试时需要在编译的时候加上(-g)选项
gdb命令:
b 设置断点,例如:
b main #表示跳到main函数
b main.cpp: 56 #56表示行号
l 打印当前的执行代码附近的10行
p 打印变量szMsg的值
p szMsg
n 执行下一行(单步执行, 类似VC中的F10)
s 进入函数(类似VC中的F10)
r 执行(类似VC中的F5)
//main.cpp
Cpp代码<embed type="application/x-shockwave-flash" width="14" height="15" src="http://andylin02.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cspan%20style%3D%22font-size%3A%20medium%3B%22%3E%3Cspan%20style%3D%22color%3A%20%233366ff%3B%22%3E%23include%20%3Ciostream%3E%0A%23include%20%3Cstdlib.h%3E%0A%23include%20%3Cdlfcn.h%3E%0Ausing%20namespace%20std%3B%0A%0A%23define%09TRUE%091%0A%23define%20FALSE%090%0Atypedef%20int%20%09BOOL%3B%0Atypedef%20void%20(*PFUN_STRING)(char*%20pszStr)%3B%0A%0ABOOL%20UseDll(char*%20szMsg)%3B%0A%0Aint%20main()%0A%7B%0A%09char%20szMsg%5B%5D%20%3D%20%22Hello%2C%20andylin!%22%3B%0A%09%0A%09%2F%2F%E8%B0%83%E7%94%A8dll%0A%09UseDll(szMsg)%3B%0A%09%0A%09return%200%3B%0A%7D%0A%0ABOOL%20UseDll(char*%20szMsg)%0A%7B%0A%09void*%20hDll%20%3D%20NULL%3B%0A%09char*%20szDllErr%20%3D%20NULL%3B%0A%09PFUN_STRING%20pfunUpper%20%3D%20NULL%3B%0A%09PFUN_STRING%20pfunLower%20%3D%20NULL%3B%0A%09%0A%09if%20(NULL%20%3D%3D%20szMsg)%0A%09%7B%0A%09%09return%20FALSE%3B%0A%09%7D%0A%09%0A%09cout%20%3C%3C%20%22The%20Origin%20String%3A%22%20%3C%3C%20szMsg%20%3C%3C%20endl%3B%0A%09%0A%09%2F%2Fopen%20dll%0A%09hDll%20%3D%20dlopen(%22.%2Fstrcase.dll%22%2C%20RTLD_LAZY)%3B%0A%09szDllErr%20%3D%20dlerror()%3B%09%0A%09if%20(szDllErr)%0A%09%7B%0A%09%09cout%20%3C%3C%20%22open%20uppercase.dll%20error!%20err%20info%3A%22%20%3C%3C%20szDllErr%20%3C%3C%20endl%3B%0A%09%09return%20FALSE%3B%0A%09%7D%0A%09%0A%09%2F%2Ffind%20the%20function%0A%09pfunUpper%20%3D%20(PFUN_STRING)dlsym(hDll%2C%20%22StrUpper%22)%3B%09%0A%09szDllErr%20%3D%20dlerror()%3B%0A%09%0A%09if%20(szDllErr)%0A%09%7B%0A%09%09cout%20%3C%3C%20%22find%20function%20StrUpper%20Error!%20err%20info%3A%22%20%3C%3C%20szDllErr%20%3C%3C%20endl%3B%0A%09%09return%20FALSE%3B%0A%09%7D%0A%09%0A%09(*pfunUpper)(szMsg)%3B%0A%09cout%20%3C%3C%20%22after%20StrUpper%20string%3A%22%20%3C%3C%20szMsg%20%3C%3C%20endl%3B%0A%09%0A%09%2F%2Fcall%20StrLower%0A%09pfunLower%20%3D%20(PFUN_STRING)dlsym(hDll%2C%20%22StrLower%22)%3B%0A%09szDllErr%20%3D%20dlerror()%3B%0A%09%0A%09if%20(szDllErr)%0A%09%7B%0A%09%09cout%20%3C%3C%20%22find%20function%20StrLower%20Error!%20err%20info%3A%22%20%3C%3C%20szDllErr%20%3C%3C%20endl%3B%0A%09%09return%20FALSE%3B%0A%09%7D%0A%09%0A%09(*pfunUpper)(szMsg)%3B%0A%09cout%20%3C%3C%20%22after%20StrLower%20string%3A%22%20%3C%3C%20szMsg%20%3C%3C%20endl%3B%0A%09%0A%09%2F%2Fclose%20handle%0A%09int%20nRet%20%3D%20dlclose(hDll)%3B%0A%09szDllErr%20%3D%20dlerror()%3B%0A%09cout%20%3C%3C%20%22close%20dll%20info%3A%22%20%3C%3C%20szDllErr%20%3C%3C%20endl%3B%09%0A%7D%0A%3C%2Fspan%3E%3C%2Fspan%3E"></embed>
- <spanstyle="font-size:medium;"><spanstyle="color:#3366ff;">#include<iostream>
- #include<stdlib.h>
- #include<dlfcn.h>
- usingnamespacestd;
- #defineTRUE1
- #defineFALSE0
- typedefintBOOL;
- typedefvoid(*PFUN_STRING)(char*pszStr);
- BOOLUseDll(char*szMsg);
- intmain()
- {
- charszMsg[]="Hello,andylin!";
- UseDll(szMsg);
- return0;
- }
- BOOLUseDll(char*szMsg)
- {
- void*hDll=NULL;
- char*szDllErr=NULL;
- PFUN_STRINGpfunUpper=NULL;
- PFUN_STRINGpfunLower=NULL;
- if(NULL==szMsg)
- {
- returnFALSE;
- }
- cout<<"TheOriginString:"<<szMsg<<endl;
- hDll=dlopen("./strcase.dll",RTLD_LAZY);
- szDllErr=dlerror();
- if(szDllErr)
- {
- cout<<"openuppercase.dllerror!errinfo:"<<szDllErr<<endl;
- returnFALSE;
- }
- pfunUpper=(PFUN_STRING)dlsym(hDll,"StrUpper");
- szDllErr=dlerror();
- if(szDllErr)
- {
- cout<<"findfunctionStrUpperError!errinfo:"<<szDllErr<<endl;
- returnFALSE;
- }
- (*pfunUpper)(szMsg);
- cout<<"afterStrUpperstring:"<<szMsg<<endl;
- pfunLower=(PFUN_STRING)dlsym(hDll,"StrLower");
- szDllErr=dlerror();
- if(szDllErr)
- {
- cout<<"findfunctionStrLowerError!errinfo:"<<szDllErr<<endl;
- returnFALSE;
- }
- (*pfunUpper)(szMsg);
- cout<<"afterStrLowerstring:"<<szMsg<<endl;
- intnRet=dlclose(hDll);
- szDllErr=dlerror();
- cout<<"closedllinfo:"<<szDllErr<<endl;
- }
- </span></span>
//lowcase.cpp
Cpp代码<embed type="application/x-shockwave-flash" width="14" height="15" src="http://andylin02.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cspan%20style%3D%22font-size%3A%20medium%3B%22%3E%3Cspan%20style%3D%22color%3A%20%233366ff%3B%22%3E%23include%20%3Cstdio.h%3E%0A%23include%20%3Cstdlib.h%3E%0A%23include%20%3Ciostream%3E%0Ausing%20namespace%20std%3B%0A%0Aextern%20%22C%22%20void%20StrLower(char*%20pszStr)%0A%7B%0A%09if%20(NULL%20%3D%3D%20pszStr)%0A%09%7B%0A%09%09return%3B%0A%09%7D%0A%0A%09int%20nLen%20%3D%200%3B%0A%09int%09i%20%3D%200%3B%0A%09%0A%09nLen%20%3D%20strlen(pszStr)%3B%0A%09for%20(i%20%3D%200%3B%20i%20%3C%20nLen%3B%20i%2B%2B)%0A%09%7B%0A%09%09if%20(%20(pszStr%5Bi%5D%20%3E%3D%20'A')%20%26%26%20(pszStr%5Bi%5D%20%3C%3D%20'Z')%20)%0A%09%09%7B%0A%09%09%09pszStr%5Bi%5D%20%2B%3D%2026%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%3C%2Fspan%3E%3C%2Fspan%3E"></embed>
- <spanstyle="font-size:medium;"><spanstyle="color:#3366ff;">#include<stdio.h>
- #include<stdlib.h>
- #include<iostream>
- usingnamespacestd;
- extern"C"voidStrLower(char*pszStr)
- {
- if(NULL==pszStr)
- {
- return;
- }
- intnLen=0;
- inti=0;
- nLen=strlen(pszStr);
- for(i=0;i<nLen;i++)
- {
- if((pszStr[i]>='A')&&(pszStr[i]<='Z'))
- {
- pszStr[i]+=26;
- }
- }
- }
- </span></span>
//uppercase.cpp
Cpp代码<embed type="application/x-shockwave-flash" width="14" height="15" src="http://andylin02.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cspan%20style%3D%22font-size%3A%20medium%3B%22%3E%3Cspan%20style%3D%22color%3A%20%233366ff%3B%22%3E%23include%20%3Cstdio.h%3E%0A%23include%20%3Cstdlib.h%3E%0A%23include%20%3Ciostream%3E%0Ausing%20namespace%20std%3B%0A%0Aextern%20%22C%22%20void%20StrUpper(char*%20pszStr)%0A%7B%0A%09if%20(NULL%20%3D%3D%20pszStr)%0A%09%7B%0A%09%09return%3B%0A%09%7D%0A%0A%09int%20nLen%20%3D%200%3B%0A%09int%09i%20%3D%200%3B%0A%09%0A%09nLen%20%3D%20strlen(pszStr)%3B%0A%09for%20(i%20%3D%200%3B%20i%20%3C%20nLen%3B%20i%2B%2B)%0A%09%7B%0A%09%09if%20(%20(pszStr%5Bi%5D%20%3E%3D%20'a')%20%26%26%20(pszStr%5Bi%5D%20%3C%3D%20'z')%20)%0A%09%09%7B%0A%09%09%09pszStr%5Bi%5D%20-%3D%2026%3B%0A%09%09%7D%0A%09%7D%0A%7D%3C%2Fspan%3E%0A%3C%2Fspan%3E"></embed>
- <spanstyle="font-size:medium;"><spanstyle="color:#3366ff;">#include<stdio.h>
- #include<stdlib.h>
- #include<iostream>
- usingnamespacestd;
- extern"C"voidStrUpper(char*pszStr)
- {
- if(NULL==pszStr)
- {
- return;
- }
- intnLen=0;
- inti=0;
- nLen=strlen(pszStr);
- for(i=0;i<nLen;i++)
- {
- if((pszStr[i]>='a')&&(pszStr[i]<='z'))
- {
- pszStr[i]-=26;
- }
- }
- }</span>
- </span>
分享到:
相关推荐
5. **处理回调**:在定义的回调函数接口中实现具体的逻辑,确保与DLL的约定一致。 6. **测试和优化**:编写测试用例验证功能是否正确工作,并根据性能需求进行优化。 了解这些概念和步骤后,开发者便能利用Java和...
QT5是Qt框架的第五个主要版本,它是一个流行的开源跨平台应用程序开发框架,支持Windows、Linux、macOS等多个操作系统。在QT5中调用DLL(动态链接库)是一项常见的需求,尤其当需要复用已有的C++代码或实现特定功能...
Java本身并不直接支持DLL调用,但通过一些第三方库,我们可以实现这样的功能。本示例以"Java调用DLL例子"为主题,使用了JNative库作为接口来实现Java调用本地动态链接库。 JNative是一个开源的Java库,它提供了一种...
在Java中,由于其跨平台的特性,原生与操作系统交互并不直接,而JNA提供了一种桥接机制,使得Java可以直接调用Windows、Linux等操作系统中的DLL文件,实现对操作系统功能的访问。 【JNA简介】 JNA提供了一种高级...
Java调用动态链接库(DLL)是Java编程中一个比较特殊的技术,主要涉及到Java与本地代码的交互。在Windows系统中,DLL(Dynamic Link Library)是实现函数复用的一种方式,它包含了一系列可供其他程序调用的函数或数据...
5. **创建C#接口**:在C#项目中,创建一个类来封装DLL的调用,定义DllImport属性以指定DLL中的函数。这些函数可能包括初始化模型、进行推理和释放资源等。 6. **调用DLL**:在C#代码中,实例化上述类,然后调用其...
这些函数的声明通常放在一个头文件中,以便在使用DLL的项目中包含。例如: ```c #ifndef MY_DLL_API_H #define MY_DLL_API_H #ifdef _WIN32 #ifdef MY_DLL_EXPORTS #define MY_DLL_API __declspec(dllexport...
Java本身并不直接支持DLL调用,但可以通过一些第三方库来实现这一目标,例如Java Native Access(JNA)。 JNA是Java平台的一个开源库,它提供了直接访问操作系统原生API的能力,无需编写C代码或使用JNI(Java ...
然后,你需要实现`callDllFunction`方法,使用`LoadLibrary`和`GetProcAddress`函数加载并调用第三方DLL中的函数。 4. **VS2010配置**:在Visual Studio 2010中,创建一个新的Win32 Console Application项目,并...
我把设备商提供的 dll 文件称之为第三方 dll 文件,因為 JNI 直接调用的是按它的标准使用 C/C++ 语言编译的 dll 文件,这个文件是客户程序员按照设备商提供的 .h 文件中的列出的方法编写的 dll 文件,我称之为第二方...
Linux下使用Java调用Hikvision设备网络SDK使用指南涉及的知识点相当丰富,本指南主要围绕如何在Linux平台下调用海康威视提供的设备网络SDK进行功能调用,重点是利用Java语言实现摄像机的抓拍功能。以下是本指南的...
Java调用DLL或SO库是跨平台编程中的一个重要技术,主要通过Java本地接口(JNI)实现。JNI允许Java代码直接调用本地(如C++)编写的动态链接库(DLL,Windows系统)或共享对象库(SO,Linux系统),从而扩展Java应用...
1. **定义接口**:在Java中创建一个接口,其方法签名对应于本地库的函数。 2. **加载库**:使用`Native.loadLibrary("库名",接口类型)`加载动态链接库,并指定接口。 3. **调用函数**:直接通过接口实例调用本地...
在LabVIEW编程环境中,调用DLL(动态链接库)是一项重要的技术,特别是在处理与硬件交互、利用第三方库或实现特定算法时。DLL是Windows操作系统中的一种共享库,它包含了一组可重用的函数和资源,可以被多个应用程序...
在Java编程中,有时我们需要调用第三方的DLL(动态链接库)来实现特定的功能,这在集成外部系统或使用特定硬件设备时尤为常见。本文将详细介绍如何在Java中调用第三方DLL,以及在不同操作系统上的部署策略。 首先,...
【标题】"dotnetbar7.0 第三方控件.net控件 dll" 是一个关于.NET框架下第三方开发的用户界面控件库,主要用于Windows应用程序的开发。DotNetBar是一款功能丰富的控件集,它包含了多种控件,如工具栏、菜单、状态栏、...
1. **创建Java接口**:定义一个Java接口,这个接口中的方法将映射到dll中的函数。例如: ```java public interface NativeDll { int doSomething(int input); } ``` 2. **编译JNI头文件**:使用`javah`工具...
Delphi是一种强大的对象 Pascal 编程语言,通常用于Windows环境,但通过使用第三方工具和特定技术,它也可以在Linux系统上创建应用。本篇将深入探讨如何使用Delphi编写共享库(SO库)并在Linux的Deepin操作系统上...
本教程将详细讲解如何在UE4 4.15版本中加载第三方的DLL(动态链接库)文件以及SO(在Android系统上的共享库)文件,以便调用其中的特定函数,例如`arwIsRunning`,在Windows和Android平台上实现跨平台功能。...
在给定的标题“关于和升达加密狗linux下java调用,(非官方)”中,我们可以推断出这是一个关于如何在Linux操作系统环境下,使用Java语言与非官方支持的和升达加密狗进行交互的主题。这种交互可能涉及到特定的API...