نوشته شده توسط
vertionality
اره اگر dll بود خوب بود . متاسفانه nupkg است ولی جاوا همه اش .jar هست . اگر جاوا ها را به so تبدیل کنم چه جوری باید برنامه اش را بنویسم با
++c بنویسم متوجه میشه کامپایلر ؟ نسخه ی exe می خواهم خیلی پلتفرم دیگر مهم نیست . ممنون
دوست عزیز !
اگر برای so. لایبرری منظورتون هست ...
#pragma once
#ifndef __PLUGIN_H__
#define __PLUGIN_H__
#include <memory>
#include <string>
#include <dlfcn.h>
class Plugin
{
public:
virtual ~Plugin() {}
virtual void func1() = 0;
virtual void func2() = 0;
};
typedef std::shared_ptr<Plugin> PluginPtr;
class PluginLoader
{
public:
PluginPtr operator()(const std::string& file);
};
#endif // __PLUGIN_H__
------------------------------------------------------------------------
#include "plugin.h"
#include <stdexcept>
PluginPtr PluginLoader::operator()(const std::string& file)
{
union { void* dl; void* dlsym; PluginPtr(*plugin)(); } get;
if(!(get.dl = dlopen(file.c_str(), RTLD_NOW|RTLD_GLOBAL)))
{
throw std::runtime_error(dlerror());
}
// Obtain pointer to the Plugin creation factory function
if(!(get.dlsym = dlsym(get.dl, "create_plugin")))
{
throw std::runtime_error(dlerror());
}
return get.plugin();
}
------------------------------------------------------------------------
#include "plugin.h"
#include <iostream>
class MyPlugin
: public Plugin
{
public:
virtual void func1()
{
std::cout << "func1()\n";
}
virtual void func2()
{
std::cout << "func2()\n";
}
};
// Factory function MUST have C linkage
extern "C" PluginPtr create_plugin()
{
return PluginPtr(new MyPlugin);
}
------------------------------------------------------------------------
#include "plugin.h"
#include <iostream>
#include <stdexcept>
int main()
{
PluginLoader load;
PluginPtr plugin;
try
{
plugin = load("build/src/.libs/myplugin.so");
if(plugin)
{
plugin->func1();
plugin->func2();
}
}
catch(std::runtime_error& e)
{
std::cout << e.what() << '\n';
}
}
توجه داشته باشید برای اینکه بتونید اشاره گرهای به تابع را تعریف کنید حتما باید بدونید که چه تابعی در لایبرری با چه امضا و چه پارامترهایی دارید که بتونید فراخوانی کنید.
مثال بالا خیلی سر راست هست !
نیاز به توضیح بود بفرمایید.