利用JNA使Java訪問本地C++
(1)C++程式碼
typedef int (*CB_OnServiceUserMessage)(uint32_t cid, uint32_t uid, const std::string& data);
extern "C"
{
void init(CB_OnMsg cb_OnMsg)
{
(*cb_OnMsg)();
std::cout << "Initializing..." << std::endl;
}
void start()
{
std::cout << "Start up!" << std::endl;
}
void stop()
{
std::cout << "Shut down!" << std::endl;
}
void send(char* msg)
{
std::cout << msg << std::endl;
}
}
(2)Java程式碼
PluginProxy.java
import java.io.IOException;
import java.lang.management.ManagementFactory;
import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class PluginProxy
{
private static String libPath;
private interface LibPluginProxy extends Library
{
static LibPluginProxy INSTANCE = (LibPluginProxy) Native.loadLibrary(libPath, LibPluginProxy.class);
public void init(Callback callback);
public void start();
public void stop();
public void send(String msg);
}
public static void main(String[] args) throws Exception {
libPath = "libPluginProxy.so";
LibPluginProxy.INSTANCE.init(new CB_OnMsg());
System.out.println("in main function.");
//add shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
Native.unregister(LibPluginProxy.class);
System.out.println("stop..");
LibPluginProxy.INSTANCE.stop();
String n = ManagementFactory.getRuntimeMXBean().getName();
if (n == null) return;
String pid = n.substring(0, n.indexOf("@"));
if (pid == null) return;
try
{
Runtime.getRuntime().exec("kill -9 " + pid);
}
catch (IOException e)
{
e.printStackTrace();
}
System.exit(-1);
}
}));
Thread t = new Thread(new Runnable() {
@Override
public void run() {
LibPluginProxy.INSTANCE.start();
System.out.println("started in thread..");
}
});
t.start();
System.out.println("started!!");
}
}
CB_OnMsg.java
import com.sun.jna.Callback;
public class CB_OnMsg implements Callback {
// 應用建立
public final int onMsg() {
System.out.println("CB_OnMsg, in function onMsg.");
return 0;
}
}
(3)編譯C++的.so共享庫
編寫makefile,細節忽略,只提供最主要的command,如下:
g++ -shared -o libplugin.so -fPIC -Wall -ggdb -D_REENTRANT -DHAVE_EPOLL -DXML_NULL -DSTATUS_NEWPROTOCOL -Wl,-rpath,../bin
#注:此段有多餘的flags,有待修改...
(4)生成Java的JAR包
在eclipse中生成JAR包,linux生成JAR命令請Google......
(5)執行JAR包呼叫.so共享庫
在linux下輸入命令:
java -cp jna-3.3.0.jar:ss.jar SalmonProxy
相關文章
- (轉)使applet能夠訪問本地資源......APP
- java高階用法之:呼叫本地方法的利器JNAJava
- 設定mstsc使遠端計算機可以訪問本地磁碟計算機
- JNA--Java呼叫DLLJava
- 外網訪問本地sqlserverSQLServer
- java高階用法之:在JNA中將本地方法對映到JAVA程式碼中Java
- 本地網站外網訪問網站
- Flutter 入門-本地訪問-MethodChannelFlutter
- 【訪問本地專案,localhosthost可以,本地ip不可以】localhost
- 利用nginx加速web訪問薦NginxWeb
- Holer實現外網訪問本地NginxNginx
- Holer實現外網訪問本地MySQLMySql
- Holer實現外網訪問本地ElasticsearchElasticsearch
- java高階用法之:JNA中的FunctionJavaFunction
- java高階用法之:JNA中的StructureJavaStruct
- 使用JNA實現Java對C的呼叫Java
- Redis 未授權訪問漏洞利用Redis
- java高階用法之:JNA型別對映應該注意的問題Java型別
- JNI訪問Java方法Java
- 前端使用Nuxt框架,配置本地https訪問前端UX框架HTTP
- Holer實現外網訪問本地WampServerServer
- Holer實現外網訪問本地RESTful APIRESTAPI
- 如何從外網訪問本地WEB應用?Web
- windows2個本地專案curl訪問Windows
- java高階用法之:JNA中的回撥Java
- 利用淘寶ip庫限制地區訪問
- 解決Django本地介面不能跨域訪問的問題Django跨域
- ReFlex:讓遠端快閃記憶體訪問擁有本地訪問的效能Flex記憶體
- C++ 突破私有成員訪問限制C++
- 如何破壞C++的訪問控制C++
- MySql資料庫C++訪問(轉)MySql資料庫C++
- C++學習——訪問修飾符C++
- C++ 順序容器中訪問元素C++
- win10下lls無法本地訪問怎麼操作_win10下lls無法本地訪問如何解決Win10
- 利用greys排查java問題Java
- 手機訪問電腦本地多個網站網站
- Holer實現外網訪問本地Apache HTTP ServerApacheHTTPServer
- Holer實現外網訪問本地SpringBootSpring Boot