色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java調用C/C++動態庫dll操作串口實例

CHANBAEK ? 來源:嵌入式大本營 ? 作者:小小飛飛哥 ? 2023-05-23 15:41 ? 次閱讀

大家好,今天分享的是使用C/C++編寫一個讀取串口數據的代碼,然后將其編譯成Windows下的動態鏈接庫(.dll文件),然后寫一個簡單的java demo來調用C/C++接口

眾所周知,java開發項目會比較方便,尤其是在一些大型項目中,java開發效率會比較高,但是一些底層的東西和一些追求效率的東西,依然會傾向使用C/C++,這是他們不可替代的優勢。所以有時會需要兩者混合起來,C/C++完成一部分較底層的功能,提供接口給java調用。

由于本人主要是從事嵌入式相關,對java也不是很熟,所以今天主要是把整個流程過一遍,把整個流程打通,搞清楚如何制作動態庫,如何被java調用即可。關于動態庫的內容,還可以參考我之前的文章。

還有就是今天所有的操作都是在命令行中完成,不會使用任何IDE ,這也符合我們嵌入式開發的習慣,能用命令行就沒必要去安裝臃腫的IDE軟件,所以大家需要先在自己的DOS窗口中安裝好必要的工具,g++用于編譯c++代碼,安裝java的jdk以提供java環境,另外把nmake路徑添加到環境變量中就可以使用Makefile了。

一、編寫cpp功能函數

這一部分就是具體的功能實現,比如在本次中,我們需要讀取串口數據,那么至少涉及四個接口:打開串口,設置波特率等參數,讀取數據,關閉串口。我們需要使用c++代碼把這四個接口的具體實現寫出來,新建一個文件夾,用于存放文件,在里面新建一個dllApi.cpp和dllApi.h文件。

dllApi.h:

#ifndef DLLAPI_H
#define DLLAPI_H
#include 
#include 
#include 
#include 
using namespace std;
class ComHelper  {
public:
    // bool Open(void);      //打開串口
    void DLL_API_Set(int baud);    //設置串口信息
    char* DLL_API_Read(char str[],int length);
    bool DLL_API_Close(void);
    bool DLL_API_OPEN(void);
};

dllApi.cpp:

#include "dllApi.h"
HANDLE  hCom ;
bool ComHelper::DLL_API_OPEN(void)
{
    int num;
    const char* com="COM";
    char buf[100]={0};
    cout<<"請輸入要打開的串口號,輸入1打開COM1"<

這里面主要是涉及兩個很重要的函數,CreateFile 和 ReadFile 函數,這兩個函數是Windows下的API,可以直接調用,關于具體的函數功能及用法,這里暫時不討論,其實和linux下的驅動是很類似的。

二、編寫一個java的demo

Java2cpp.java :

public class Java2cpp
{
static
{
System.loadLibrary("javaCallcpp");
}


public native boolean DLL_OPEN();
public native void DLL_Set(int baud);    //設置串口信息
public native String DLL_Read(char str[],int length);
public native boolean DLL_Close();


public static void main(String args[])
{


    System.out.println("code test....");
    boolean ret;
    char buf[]={0};
    String str;
    Java2cpp com = new Java2cpp();
    ret=com.DLL_OPEN();
    if(!ret)
    {
        System.out.println("打開串口失敗");
        return;
    }
    System.out.println("打開串口成功");
    com.DLL_Set(115200);
    while(true)
    {
        str=com.DLL_Read(buf, 100);
        System.out.println(str);
    }
}
}

這里主要注意兩個點,一個是使用System.loadLibrary( "javaCallcpp" );導入了一個庫,這個庫的名字是javaCallcpp 也就是說待會兒我們要生成一個javaCallcpp.dll的文件。第二點是public native boolean DLL_OPEN ();等幾個API。

使用native關鍵字說明這個方法是原生函數,也就是這個方法是用C/C++語言實現的,并且被編譯成了DLL,由java去調用。使用native關鍵字說明這個方法是原生函數,也就是這個方法是用C/C++語言實現的,并且被編譯成了DLL,由java去調用。這些函數的實現體在DLL中,JDK的源代碼中并不包含,你應該是看不到的。對于不同的平臺它們也是不同的。這也是java的底層機制,實際上java就是在不同的平臺上調用不同的native方法實現對操作系統的訪問的。

這個時候還沒有dll文件,因此有了第三步:

三、生成dll文件

首先進入到文件目錄,在命令行中使用

javac -h ./ Java2cpp.java

命令生成Java2cpp.h文件,這個頭文件是不可修改的,大概長這樣

圖片

接下來新建一個Java2cpp.cpp文件,在這個文件中調用第一步中實現的接口

Java2cpp.cpp :

#include "Java2cpp.h"
#include "dllApi.h"
JNIEXPORT jboolean JNICALL Java_Java2cpp_DLL_1OPEN
  (JNIEnv *, jobject)
{
    ComHelper com;
    bool var=0;
    var=com.DLL_API_OPEN();
    return var;
}


JNIEXPORT void JNICALL Java_Java2cpp_DLL_1Set
  (JNIEnv *, jobject, jint baud)
{
    ComHelper com;
    com.DLL_API_Set(115200);
    return;
}


JNIEXPORT jstring JNICALL Java_Java2cpp_DLL_1Read
  (JNIEnv * env, jobject, jcharArray ay, jint)
{
    char array[1024];
    char* buf=array;
    int len=strlen(buf);

    jstring ret;
    ComHelper com;
    com.DLL_API_Read(array,100);


    //將char[] 轉化為jstring
    //定義java String類 strClass
     jclass strClass = (env)->FindClass("Ljava/lang/String;");
     //獲取java String類方法String(byte[],String)的構造器,用于將本地byte[]數組轉換為一個新String
    jmethodID ctorID = (env)->GetMethodID(strClass, ", "([BLjava/lang/String;)V");
    //建立byte數組
    jbyteArray bytes = (env)->NewByteArray((jsize)strlen(buf));
    //將char* 轉換為byte數組
    (env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(buf), (jbyte*)buf);
    //設置String, 保存語言類型,用于byte數組轉換至String時的參數
    jstring encoding = (env)->NewStringUTF("gbk"); 
    //將byte數組轉換為java String,并輸出
    ret= (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
    return ret;
}


JNIEXPORT jboolean JNICALL Java_Java2cpp_DLL_1Close
  (JNIEnv *, jobject)
{
    bool ret;
    ComHelper com;
    ret=com.DLL_API_Close();
    return ret;
}

實際上你也可以直接在這里實現具體的功能代碼,這樣就省掉第一步了,不過為了一個分層的思想,更方便維護,還是不要省掉第一步比較好。

在這個文件中,使用#include "dllApi.h" 來調用第一步中的接口,然后這個文件是被java程序調用的,這里要稍微注意一下數據類型的轉化。 比如char[] 轉化為jstring。

然后在命令行中將前面的dllApi.cpp 和這個Java2cpp.cpp同時編譯成dll文件。

g++ -shared -fPIC Java2cpp.cpp dllApi.cpp -o javaCallcpp.dll -I "F:\\Program Files\\Java\\jdk-11.0.12\\include"  -I "F:\\Program Files\\Java\\jdk-11.0.12\\include\\win32"

圖片

這樣在目錄中就出現了javaCallcpp.dll文件。

圖片

四、編譯并運行java程序

在命令行中輸入

javac Java2cpp.java

生成Java2cpp.class文件,.class文件就是java編譯后的可執行文件

最后在命令行中輸入

java Java2cpp  //注意沒有.class后綴

就可以運行java程序了。

圖片

這樣就成功實現了java調用dll庫,我們也可以將上面那些命令寫成Makefile文件,和linux下的Makefile是一樣的,只不過在Windows下不是make命令,而是nmake,使用時需要將nmake的路徑添加到系統環境變量中。

圖片

圖片

總結:

1、編寫cpp具體的功能接口代碼

2、編寫java程序,使用native關鍵字聲明調用本地接口

3、javac -h (在舊版本中直接使用javah)生成頭文件,根據頭文件編寫對應cpp源文件

4、使用g++ 編譯生成.dll文件

5、使用javac xxx.java生成xxx.class文件并執行

當然如果不習慣使用命令行,也可以結合Visual Studio 和 Eclipse 兩個IDE進行操作,在這里不做闡述。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • WINDOWS
    +關注

    關注

    4

    文章

    3586

    瀏覽量

    89929
  • JAVA
    +關注

    關注

    19

    文章

    2980

    瀏覽量

    105678
  • 串口
    +關注

    關注

    14

    文章

    1570

    瀏覽量

    77679
  • C++
    C++
    +關注

    關注

    22

    文章

    2115

    瀏覽量

    74152
  • 動態庫
    +關注

    關注

    0

    文章

    17

    瀏覽量

    6291
收藏 人收藏

    評論

    相關推薦

    Qt創建動態C#調用,通過回調完成交互

    動態(dll),給C#加載調用,并且還需要設置回調,方便C#知道Qt運行時,輸出內部的一些實時
    的頭像 發表于 09-09 11:37 ?5366次閱讀
    Qt創建<b class='flag-5'>動態</b><b class='flag-5'>庫</b>給<b class='flag-5'>C</b>#<b class='flag-5'>調用</b>,通過回調完成交互

    C/ C++/ Java 程序設計經典教程》

    C語言的標準 1.9 重要的軟件發展趨勢:面向對象的技術 1.10 C++語言以及C++編程 1.11 Java語言以及
    發表于 11-13 11:22

    JAVAC++區別

    指針來直接訪問內存無指針,并且增添了自動的內存管理功能,從而有效地防止了cc++語言中指針操作失誤,如野指針所造成的系統崩潰。但也不是說JAVA沒有指針,虛擬機內部還是使用了指針,只
    發表于 04-11 15:19

    LabVIEW調用visual studio C#生成的動態鏈接dll文件

    1)visual studio C#生成動態鏈接dll文件2)LabVIEW通過構造器調用C#
    發表于 07-23 23:18

    JAVAC++區別

    來直接訪問內存無指針,并且增添了自動的內存管理功能,從而有效地防止了cc++語言中指針操作失誤,如野指針所造成的系統崩潰。但也不是說JAVA沒有指針,虛擬機內部還是使用了指針,只是外
    發表于 10-10 14:50

    請問各位labview大佬關于調用dll動態鏈接的問題

    我最近學習labview的dll動態調用,我用的vs2017來編譯c++并生成dll文件,但是
    發表于 03-10 18:43

    JavaC++的區別

    來直接訪問內存無指針,并且增添了自動的內存管理功能,從而有效地防止了cc++語言中指針操作失誤,如野指針所造成的系統崩潰。但也不是說JAVA沒有指針,虛擬機內部還是使用了指針,只是外
    發表于 09-13 16:02

    labview 動態調用 C# 生成的dll

    目的: 用labview動態調用C#生成的dll問題:目前知道可以用.net的構造器調用,但是該方式不像“
    發表于 01-04 15:47

    Tcl/Tk命令與C/C++的集成研究

    針對 Tcl/Tk 腳本中需要調用C/C++函數的問題,簡要說明了Tcl/Tk 命令的運行機理,給出了一個使用Tcl/Tk 命令來調用C/
    發表于 08-26 09:47 ?36次下載

    C++動態鏈接的創建和調用

    動態連接的創建步驟: 一、創建Non-MFC DLL動態鏈接 1、打開File —> New —> Project選項,選擇Win3
    發表于 11-24 18:13 ?7次下載

    什么是DLL (動態連接)

    什么是DLL (動態連接) DLL動態連接),既然是
    發表于 11-28 14:51 ?1.5w次閱讀

    C語言與C++相互調用

    ? ? 1CC++相互調用 在一個嵌入式系統中大部分的底層和驅動層更多的是采用C語言來進行開發,而上層應用、服務更多的采用C++等高級語言
    的頭像 發表于 01-18 11:05 ?3446次閱讀
    <b class='flag-5'>C</b>語言與<b class='flag-5'>C++</b>相互<b class='flag-5'>調用</b>

    LABVIEW調用C# DLL實例分享

    LABVIEW調用C# DLL實例分享
    發表于 01-04 11:20 ?106次下載

    java上位機開發(c調用)

    所有的動態語言,包括在java在內,一般都會提供一個調用c的方法。java語言的出現是在上個世
    發表于 05-09 10:00 ?0次下載
    <b class='flag-5'>java</b>上位機開發(<b class='flag-5'>c</b><b class='flag-5'>庫</b><b class='flag-5'>調用</b>)

    CC++編寫環境下LabVIEW如何調用動態

    C語言編寫的動態鏈接相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 這一導出語句,在
    發表于 06-11 09:15 ?8134次閱讀
    <b class='flag-5'>C</b>和<b class='flag-5'>C++</b>編寫環境下LabVIEW如何<b class='flag-5'>調用</b><b class='flag-5'>動態</b><b class='flag-5'>庫</b>?
    主站蜘蛛池模板: 欧美日韩中文字幕综合图区 | 久久亚洲精品成人 | 日本不卡免免费观看 | 亚洲中文在线偷拍 | 日韩精品免费一区二区 | 古月娜下面好紧好爽 | 高清不卡伦理电影在线观看 | 久欠热视频精品首页 | 国产成人mv 在线播放 | 亚洲欧美日韩高清中文在线 | 免费看午夜高清性色生活片 | 美女被黑人巨大进入 | a亚洲在线观看不卡高清 | 日本护士hd| 伊人网综合在线观看 | 国产在线观看免费观看 | 国产电影三级午夜a影院 | 哺乳期妇女挤奶水36d | 在线观看免费视频a | 欧美激情视频二区 | 伊人网综合在线观看 | 公交车被CAO到合不拢腿 | 一本道久在线综合道 | 精品无人区麻豆乱码1区2 | 纯肉高H放荡受BL文库 | 亚洲热在线视频 | 成人天堂婷婷青青视频在线观看 | adc影院欢迎您大驾光临入口 | 亚洲精品在线看 | 娇妻归来在线观看免费完整版电影 | 嫩草影院地址一二三 | 久久99re热在线观看视频 | 玩弄放荡人妻一区二区三区 | 欧洲美女人 一级毛片 | 忘忧草秋观看未满十八 | 亚洲色综合狠狠综合区 | 精品久久香蕉国产线看观看麻豆 | 精品无码无人网站免费视频 | 亚洲第一国产 | 日产精品高潮呻吟AV久久 | 国模丽丽啪啪一区二区 |