java動態調用c++庫

前言

最近在做一個通過java程序調用c++動態語言庫,在網上百度,谷歌找了諸多例子,還是屢試不爽。經過一番折騰還是披荊斬棘,創出一條道路。希望分享給正在迷茫的朋友們...

使用的環境

spring boot + gradle

JNI介紹

JNI全拼是Java Native Interface,中文意思為Java本地調用。JNI標準是Java平臺的一部分,它允許java和其他語言的代碼進行交互。JNI開始是為了本地已經編譯好的語言,尤其是C和C++而設計的,我們也可以使用JNI和其他語言進行溝通,我們只要調用約定受支持了就可以了。

JNI vs JNA

加載流程

使用jni和jna的區別這里便不再多說。這里我使用的是jna的方式。不多說,直接擼代碼,首先在依賴文件中加入相關jar包。

compile group: 'com.sun.jna', name: 'jna', version: '3.0.9'

windows環境

  • 定義好java需要調用的本地方法,即native

    EastmzGame.class

        /*** get game result from third* @return*/public native String getGameResult();
    復制代碼
  • 生成.class編譯文件

    在類文件的當前目錄執行,這里加入了字符,防止亂碼。

    javac -encoding utf-8 EastmzGame.java

  • 生成.h頭文件

    src.main.java目錄下執行 javah -classpath . -jni com.bsmao.task.jni.EastmzGame

  • 再由vc編譯工具將.h文件實現并且編譯出.dll文件,linux為.so文件。

    .dll文件放入到項目中或者放到e盤中

    我這里是放到了resources下面

  • java中再調用.dll文件
    static {try{String path = ResourceUtils.getURL("classpath:jniLibs/GetData.dll").getPath();System.load(path);//System.load("E:/bsmao/dll/MFCLibrary11.dll"); //e盤的絕對地址}catch (Exception e){e.printStackTrace();}}
復制代碼
  • 測試調用結果

    這是經過處理過的數據

linux環境

定義本地方法:

本文是指定路勁讀取so文件(和so文件生成的文件路徑保持一致)

編譯.class 生成.h,.c文件

將上面兩個文件傳入到linux指定文件夾下

/usr/local/bsmao/lib

編譯出so文件 命令:

sudo cc -I /usr/local/bsmao/java/jdk1.8.0_162/include/linux -I /usr/local/bsmao/java/jdk1.8.0_162/include/ -I /usr/local/bsmao/lib/ -fPIC -shared -o libEastmzGame.so com_bsmao_task_jni_EastmzGame.c 
復制代碼

生成出so文件

調用方式和windows一樣

            EastmzGame eastmzGame = new EastmzGame();byte[] res = eastmzGame.ElevenAgreement();
復制代碼

測試結果






如果覺得有幫助,請打賞...(^_^ *** ^_^)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450891.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450891.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450891.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何刪除虛擬機上的操作系統、刪除新建的虛擬機

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 打開VMware,我安裝了三個虛擬系統,要對win98進行刪除,從磁盤上刪除~~ 2、雙擊你要刪除的系統&#xf…

什么是QoS技術

QoS(Quality of Service)是服務質量的簡稱。從傳統意義上來講,無非就是傳輸的帶寬、傳送的時延、數據的丟包率等,而提高服務質量無非也就是保證傳輸的帶寬,降低傳送的時延,降低數據的丟包率以及時延抖動等。…

一套完整的用戶增長系統架構

互聯網的世界里一切都是為了增長,靈光一現的創新可能會讓一個產品成功,但絕不可能長久。 在用戶增長的領域里,如何復用一套框架,找到最佳實踐的一條路徑,再配備一點運氣,去實現商業成功是我一直所探索的話題…

編譯性語言、解釋性語言和腳本語言

什么是編譯性語言、解釋性語言和腳本語言 計算機不能直接理解高級語言,只能直接理解機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能值型高級語言編寫的程序。  翻譯的方式有兩種,一個是編譯,一個是解釋。…

對多租戶的理解

一、 多租戶定義 多租戶定義: 多租戶技術或稱多重租賃技術,簡稱SaaS,是一種軟件架構技術,是實現如何在多用戶環境下(此處的多用戶一般是面向企業用戶)共用相同的系統或程序組件,并且可確保各用…

查看VMware上虛擬機的 ip 地址

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 開啟虛擬機: 2.輸入賬號密碼登陸到虛擬機中 3. 選擇 xxx Home 右鍵---- Open in Terinal 進入命令行頁面 ----- 輸入命令…

Hibernate之表間關系

ManyToOne 多對一,是最常見的表間關系,對應關系數據庫中的外鍵關系。通常用于建立子實體和其父實體的關聯關系 Entity(name "Person") public static class Person {IdGeneratedValueprivate Long id;//Getters and setters are omitted for …

Python大神告訴你,學習Python應該讀哪些書!

關注頭條號,私信回復資料會有意外驚喜呦………………最后一張照片有資料呦。在傳統的Web開發之外的領域,Python開發人員的就業機會越來越多,無論你是初學者還是大神,現在正是投入到Python學習的好時機。一個IBM的博客文章報道了如…

腳本語言

腳本語言(Script language,scripting language,scripting programming language)是為了縮短傳統的編寫-編譯-鏈接-運行(edit-compile-link-run)過程而創建的計算機編程語言。此命名起源于一個腳本“screenp…

Java Agent

一、什么是 Java Agent ? 籠統地來講,Java Agent 是一個統稱,該功能是 Java 虛擬機提供的一整套后門。通過這套后門可以對虛擬機方方面面進行監控與分析。甚至干預虛擬機的運行。 Java Agent 又叫做 Java 探針,Java Agent 是在 …

JDK 1.8 官網下載地址(linux / windows)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 JDK 1.8 官網下載地址: JDK 1.8 官網下載地址(linuxwindows) 上面連接可以直接點擊,連接…

跟著太白老師學python day11 可迭代對象和迭代器

如果對象的屬性中有__iter__屬性就說明是可迭代的,容器類的數據類型都是可迭代對象 如果對象的屬性中既有__iter__屬性也有__next__屬性,就說明這個對象是迭代器 如何判斷一個函數是不是可迭代的,是不是迭代器 方法一 s 123 print(__iter__ …

攪局者奇虎360:特供機背后的周式隱憂

摘要:從未涉足制造,將來也“絕不參與制造”的360,卻聲稱要進軍智能手機。從未涉足制造,將來也“絕不參與制造”的360,卻聲稱要進軍智能手機。 5月4日晚間,“長達半年的思考”后,奇虎360董事長周…

數據結構基礎入門知識

數據結構基礎入門知識 ------ 數據結構:理解和練習《異類-不一樣的成功啟示錄》IP/26 192IP/25 128IP/24192.12864 3216 2 1 NTP:時間同步服務器高手都是最仔細的,嚴謹的 telnet 查看某個端口是否可用,是否是開啟狀態的要有探索冒險的精神 --…

Linux下安裝jdk8步驟詳述

見:https://www.cnblogs.com/shihaiming/p/5809553.html 0.下載jdk8 登錄網址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 選擇對應jdk版本下載。(可在Windows下下載完成后,通過文件夾…

用Kotlin擼一個圖片壓縮插件-實戰篇(三)

簡述: 由于個人原因,已經有很長一段時間沒有寫過文章,有句話是那么說的只要開始就不會太晚,所以我們開始《用Kotlin擼一個圖片壓縮插件》系列文章最后一篇實戰篇。實際上我已經把源碼發布到了GitHub,代碼很簡單。有了前兩篇文章的…

后端進階技術總結

1、SDK與API的區別? SDK是Software Development Kit的縮寫,即軟件開發工具包。可以把SDK想象成一個虛擬的程序包,在這個程序包中有一份做好的軟件功能,這份程序包幾乎是全封閉的,通過接口聯通外界,相應的接…

最簡容器化動手小實踐——再戰flappybird

《Flappy Bird》是一名越南開發者所開發的游戲,這款游戲的主要內容是幫助一只小鳥穿越水管的層層阻礙,玩家所需要的只是點擊屏幕從而調整小鳥的高度。而令這款游戲與眾不同的是,這款游戲的難度夸張的驚人,大多數玩家在初次上手之后…

為什么電影電視幀率不取整數?

英文名稱:time code時間碼概念時間碼(time code)是攝像機在記錄圖像信號的時候,針對每一幅圖像記錄的唯一的時間編碼。一種應用于流的數字信號。該信號為視頻中的每個幀都分配一個數字,用以表示小時、分鐘、秒鐘和幀數…

linux下用rpm 安裝jdk

1.下載jdk的rpm安裝包,這里以jdk-7u4-linux-i586.rpm為例進行說明 下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2. 將jdk-7u4-linux-i586.rpm 移動到合適的安裝目錄上,安裝軟件不要在/home路徑下&#xf…