最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang開發(fā)動態(tài)庫的實(shí)現(xiàn)

 更新時(shí)間:2019年11月29日 08:28:03   作者:鍵盤上的麒麟臂  
這篇文章主要介紹了Golang開發(fā)動態(tài)庫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

我們平時(shí)使用的動態(tài)庫都是由C/C++開發(fā)最后生成的.so文件。

可以先看看一個(gè)JNI的開發(fā)過程。

一. 開發(fā)JNI

有兩種方式,現(xiàn)在一種比較快的方式是AndroidStudio你在創(chuàng)建項(xiàng)目選擇Module的時(shí)候它會給你個(gè)JNI的模板,直接使用那個(gè)就行。

但是我還是比較喜歡傳統(tǒng)的方法。

簡單來說傳統(tǒng)的方式就是你用命令來把java文件變成C++的頭文件

簡單演示一遍,先寫個(gè)java類

public class TestJni {

  static {
    System.loadLibrary("KylimTest");
  }

  public static native String getMsg();

}

定義了一個(gè)native修飾的方法,在代碼調(diào)用這個(gè)方法之后JNI就會自動調(diào)用到動態(tài)庫中相應(yīng)的方法。

將這個(gè)類用命令生成頭文件,來到文件夾路徑下輸入命令

javah -jni 包名.類名

可以看到默認(rèn)會生成一個(gè).h的頭文件,自動命名為 包名_類名.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_kylim_nativetest_TestJni */

#ifndef _Included_com_kylim_nativetest_TestJni
#define _Included_com_kylim_nativetest_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:   com_kylim_nativetest_TestJni
 * Method:  getMsg
 * Signature: (I)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_kylim_nativetest_TestJni_getMsg
 (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

主要的核心就是這句

JNIEXPORT jstring JNICALL Java_com_kylim_nativetest_TestJni_getMsg
 (JNIEnv *, jclass);

其它的我也不清楚,都是C相關(guān)的, 如果你嫌用命令生成麻煩,你可以自己創(chuàng)建一個(gè).h文件然后方法命名就按照這樣的規(guī)范去寫

頭文件只是為了定義,我們需要自己寫原文件,所以要創(chuàng)建一個(gè).cpp結(jié)尾的文件

#include "com_kylim_nativetest_TestJni.h"

JNIEXPORT jstring JNICALL Java_com_kylim_nativetest_TestJni_getMsg
    (JNIEnv *env, jclass cls){

  jstring result = env->NewStringUTF("結(jié)果是");
  return result;
}

方法命名是有規(guī)范的,看Demo也知道怎么規(guī)范了,沒必要多解釋,這樣兩端的代碼就寫完了,但是僅僅這樣是無法運(yùn)行項(xiàng)目的。

還需要些一些配置,因?yàn)樵贏ndroidStudio中是Gradle去幫我們編譯C++的代碼,所以需要寫這些配置。如果你不是用AS開發(fā),你用其它工具開發(fā)直接生成.so文件再丟進(jìn)AS中的話,可以忽略這一步。

先看看我的Jni目錄

要創(chuàng)建一個(gè)Android.mk

#固定寫法
LOCAL_PATH:=$(call my-dir)
#固定寫法
include $(CLEAR_VARS)
#生成so名稱
LOCAL_MODULE := KylimTest
LOCAL_SRC_FILES := testone.cpp
#固定寫法
include $(BUILD_SHARED_LIBRARY)

具體的配置可自行去查找,這里不是主要講JNI的,所以就不講這么細(xì)。

還需要一個(gè)Application.mk

# 選擇不同的 ABI,多個(gè)使用空格作為分隔符,全部是all
# APP_ABI := armeabi armeabi-v7a
APP_ABI := armeabi-v7a

# 指定要使用的運(yùn)行時(shí)
APP_STL := c++_static

當(dāng)然這樣還不行,都說了是Gradle進(jìn)行編譯,那么肯定還要在Gradle中寫一些配置

android {
   defaultConfig {
        ndkBuild {
        //指定 Application.mk 的路徑
        arguments "NDK_APPLICATION_MK:=src/main/jni/Application.mk"
        //指定生成哪些平臺的 so 文件
        abiFilters "armeabi-v7a"
        //cFlags 和 cppFlags 是用來設(shè)置環(huán)境變量的, 一般不需要動
        cFlags "-DTEST_C_FLAG1", "-DTEST_C_FLAG2"
        cppFlags "-DTEST_CPP_FLAG2", "-DTEST_CPP_FLAG2"
      }
   }

  sourceSets { main { jni.srcDirs = ['src/main/jni'] } }

  externalNativeBuild {
    ndkBuild {
      path file('src/main/jni/Android.mk')
    }
  }

}

這樣就能簡單的跑一個(gè)JNI的Demo,總的來說就是Java這邊寫一個(gè)類定義一些native方法和加載,C++這邊寫具體的方法實(shí)現(xiàn)。

二.用Go開發(fā)動態(tài)庫

上面說的原生方法是用C/C++進(jìn)行開發(fā)的,那么如果你不會C++的話怎么辦,C++的學(xué)習(xí)也并非這么容易,就拿兩邊的類型來說,一開始新手肯定會碰到類型轉(zhuǎn)換的問題,往往會先勸退一些人,但是Go不一樣,有Java基礎(chǔ)的話學(xué)起go還是挺快的。

那么用Go開發(fā)的動態(tài)庫是怎樣的?也是SO文件嗎,是不是也像C++一樣,編譯后經(jīng)過某步操作生成SO文件。

我看到網(wǎng)上有些文章確實(shí)是寫怎么生成so的,但是說得太少,感覺不可靠,直到我看到官方有寫。

可以在官方中看到是有一個(gè)mobile的庫的

https://github.com/golang/mobile

讀下去它會指引你去wiki

https://github.com/golang/go/wiki/Mobile

可以看出它會打出一個(gè)aar的文件,那么aar對于我們接入來說確實(shí)很方法,但我很想探究這個(gè)aar里面究竟是什么,所以我們需要打出一個(gè)aar然后解壓看看它里面到底是什么

這里先說一下,下載這個(gè)庫之前,你本地肯定先要配置好Go的環(huán)境

然后按照這里的流程就行下載

go get -d golang.org/x/mobile/example/basic

但這輸入這條命令需要科學(xué)上網(wǎng)的方式才能下載,總的來說很麻煩。

所以我們可以直接克隆mobile的庫,就是上面的這個(gè)鏈接 https://github.com/golang/mobile

直接下載下來,除此之外,還需要tools,這些都在Go中,鏈接 https://github.com/golang/tools

將這兩個(gè)下載下來,然后拷貝到你的Go的以下路徑

go/src 創(chuàng)建一個(gè)文件夾golang.org/x ,把這兩個(gè)文件夾丟進(jìn)去

然后輸入命令

gomobile init

可以輸入命令 查看安裝配置是否成功

gomobile bind -help

如果配置成功會給你一些提示

我感覺文檔寫得還是不算清楚,但是它有告訴你用什么命令生成aar

gomobile bind -o app/hello.aar -target=android golang.org/x/mobile/example/bind/hello

你在GoPath中創(chuàng)建一個(gè)Go文件,我是用GoLand進(jìn)行開發(fā)的,項(xiàng)目的目錄設(shè)置成GoPath,編寫完之后,可以直接在文件中運(yùn)行

gomobile bind -o 輸入文件名.aar -target=android

這樣就能在文件夾中生成一個(gè)aar

接著我們看看aar里面是什么,解壓

首先可以看到生成這些ABI的so文件,再看看Manifest

這里有限制最低版本,所以如果你的版本比他還低的話就需要注意一下了

然后res里面是可以看到?jīng)]有文件的。

最后我們反編譯class文件

因?yàn)檫@不是Demo,直接是寫公司的項(xiàng)目,所以有些地方要碼,但是不影響。

從這里看得出,go幫我們生成了一個(gè)java文件,這個(gè)java文件定義了再Go中命名的原生方法。

其實(shí)從這里就可以看出,Go用的也基本是我們最上面寫的JNI的方法,只是他幫你封裝起來了而已

但是他的原生代碼是不是轉(zhuǎn)成C++的我就不清楚了,因?yàn)槲也粫淳幾gSO文件。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • go?doudou開發(fā)單體RESTful服務(wù)快速上手教程

    go?doudou開發(fā)單體RESTful服務(wù)快速上手教程

    這篇文章主要為大家介紹了go?doudou開發(fā)單體RESTful服務(wù)快速上手教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 深入講解Go語言中函數(shù)new與make的使用和區(qū)別

    深入講解Go語言中函數(shù)new與make的使用和區(qū)別

    大家都知道Go語言中的函數(shù)new與函數(shù)make一直是新手比較容易混淆的東西,看著相似,但其實(shí)不同,不過解釋兩者之間的不同也非常容易,下面這篇文章主要給大家介紹了關(guān)于Go語言中函數(shù)new與make區(qū)別的相關(guān)資料,需要的朋友可以參考下。
    2017-10-10
  • go RWMutex的實(shí)現(xiàn)示例

    go RWMutex的實(shí)現(xiàn)示例

    本文主要來介紹讀寫鎖的一種Go語言的實(shí)現(xiàn)方式RWMutex,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Go語言實(shí)現(xiàn)遍歷文件夾

    Go語言實(shí)現(xiàn)遍歷文件夾

    這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)遍歷文件夾的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下
    2023-05-05
  • GO語言make和new關(guān)鍵字的區(qū)別

    GO語言make和new關(guān)鍵字的區(qū)別

    本篇文章來介紹一道非常常見的面試題,到底有多常見呢?可能很多面試的開場白就是由此開始的。那就是?new?和?make?這兩個(gè)內(nèi)置函數(shù)的區(qū)別,希望對大家有所幫助
    2023-04-04
  • Golang程序漏洞檢測器govulncheck的安裝和使用

    Golang程序漏洞檢測器govulncheck的安裝和使用

    govulncheck 是一個(gè)命令行工具,可以幫助 Golang 開發(fā)者快速找到項(xiàng)目代碼和依賴的模塊中的安全漏洞,該工具可以分析源代碼和二進(jìn)制文件,識別代碼中對這些漏洞的任何直接或間接調(diào)用,本文就給大家介紹一下govulncheck安裝和使用,需要的朋友可以參考下
    2023-09-09
  • Go?語言結(jié)構(gòu)體鏈表的基本操作

    Go?語言結(jié)構(gòu)體鏈表的基本操作

    鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的,這篇文章主要介紹了Go?語言結(jié)構(gòu)體鏈表,需要的朋友可以參考下
    2022-04-04
  • Golang爬蟲及正則表達(dá)式的實(shí)現(xiàn)示例

    Golang爬蟲及正則表達(dá)式的實(shí)現(xiàn)示例

    本文主要介紹了Golang爬蟲及正則表達(dá)式的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Golang有類型常量和無類型常量的區(qū)別

    Golang有類型常量和無類型常量的區(qū)別

    本文主要介紹了Golang有類型常量和無類型常量的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • glow工具在命令行讀取Markdown好物分享

    glow工具在命令行讀取Markdown好物分享

    這篇文章主要為大家介紹了一款實(shí)用的命令行工具glow,這個(gè)CLI工具可以在命令行讀取Markdown,這對于碼農(nóng)來說非常友好,使用起來也非常舒爽
    2022-07-07

最新評論

普兰店市| 旬邑县| 密云县| 监利县| 周口市| 米易县| 孝昌县| 西畴县| 仁寿县| 康乐县| 芷江| 阿瓦提县| 类乌齐县| 密云县| 富宁县| 武川县| 祁连县| 武乡县| 柘城县| 玛曲县| 嵊州市| 泾源县| 长阳| 永清县| 三门县| 永德县| 如皋市| 芦溪县| 汕头市| 崇阳县| 韩城市| 噶尔县| 裕民县| 辽阳县| 屯留县| 门头沟区| 宝应县| 阿鲁科尔沁旗| 开封县| 静海县| 太白县|