17.JNI Android開發(fā)

jni.h頭文件

  • 定義了java和C語言之間進行數(shù)據(jù)對應(yīng)的關(guān)系
  • 在結(jié)構(gòu)體內(nèi)部封裝了java和C語言之間進行數(shù)據(jù)轉(zhuǎn)換的函數(shù)指針

JNIEnv typedef const struct JNINativeInterface* JNIEnv;

  • JNIEnv *env
  • typedef struct JNINativeInterface* JNIEnv;
  • struct JNINativeInterface*<=>JNIEnv 結(jié)構(gòu)體一級指針
  • env<=>JNIEnv <=> struct JNINativeInterface*二級指針
  • (*env)->NewStringUTf

JNI開發(fā)涉及到的概念

  • 交叉編譯 在host平臺下為目標(biāo)平臺(target)編譯代碼 taget平臺不足以支撐編譯
  • 平臺 操作系統(tǒng) windows linux macos
  • cpu架構(gòu):x86 arme mips 指令集不同
  • 工具鏈

動態(tài)庫和靜態(tài)庫區(qū)別

  • 動態(tài)庫 linux .so windows .dll 小 共享庫
  • 靜態(tài)庫 linux .a windows libs 大

jni開發(fā)用到的工具

NDK目錄結(jié)構(gòu)

  • native development kit 本地開發(fā)工具集
  • build/core/下面有很多mk文件饶氏,指導(dǎo)工程構(gòu)建和編譯的配置文件 像建筑圖紙
  • doc下面開發(fā)文檔
  • platforms提供函數(shù)庫的頭文件和庫文件
  • prebuilt各個平臺的調(diào)試工具 windows下make.exe 工程管理器 相當(dāng)于建造大樓的監(jiān)工(按照圖紙進行監(jiān)工)
  • sample 谷歌工程師寫的例子
  • source第三方庫 不關(guān)心
  • toolchains 交叉編譯工具鏈,相當(dāng)于農(nóng)民工 toolchains\x86-4.4.3\prebuilt\windows\bin下有很多工具鏈古程,只需要配置好配置文件用好mk工具喊崖,會自動調(diào)里面的工具鏈
  • test 在linux環(huán)境下可以執(zhí)行run-tests.sh腳本,測試當(dāng)前環(huán)境是否配置好 Windows下跑不了
  • ndk-build.cmd 谷歌包裝好的make工具 怎么用呢茁裙?在當(dāng)前文件夾下按住shift 右鍵-在此處打開命令行窗口-ndk-build -v回車 make工具 可以對照make里面看看 沒必要掌握make復(fù)雜的用法节仿,只需要用谷歌包裝好的ndk-build.cmd就行

JNI開發(fā)流程

eclipse開發(fā)jni

開發(fā)流程一

  • 1.定義本地方法

    • public native String hello();
  • 2.在工程下創(chuàng)建jni目錄

  • 3.創(chuàng)建hello.c源文件

      #include <jni.h>  //包含jni.h頭文件  java和c相互對應(yīng) 以及相互轉(zhuǎn)換方法
      /**
       * 函數(shù)名:Java_包名(包名中.以_代替)_類名_方法名
       *  JNIEnv *env結(jié)構(gòu)體二級指針  java和C語言數(shù)據(jù)轉(zhuǎn)換的函數(shù)指針
       *  jobject obj:調(diào)用當(dāng)前函數(shù)的java類 C語言調(diào)用java方法時需要用到
       */
      jstring  Java_com_itheima_hello_MainActivity_hello(JNIEnv *env,jobject obj){
          char *buf="hello from c";
          return (*env)->NewStringUTF(env,buf);
      }
    
  • 4.創(chuàng)建Android.mk文件

          LOCAL_PATH := $(call my-dir)
    
          include $(CLEAR_VARS)
      
          LOCAL_MODULE    := hello    #指定生成的庫名  lib庫名.so
          LOCAL_SRC_FILES := hello.c #編譯的C語言源文件 如果有多個源文件 空格依次排開
      
          include $(BUILD_SHARED_LIBRARY) #指定生成動態(tài)庫  
    
  • 5.創(chuàng)建Application.mk文件

            APP_ABI := armeabi armeabi-v7a x86 #指定生成的庫的平臺
    
  • 6.進入到j(luò)ni目錄執(zhí)行ndk-build命令生成so庫(libs)

  • 7.程序運行時加載so庫

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

eclipse集合ndk開發(fā)

  • 1.配置ndk路徑 windows-prefreence-android-ndk
  • 2.定義本地方法
    • public native String hello();
  • 3.右鍵-Android Tools-Add native support (指定生成的so庫名)
  • 4.編寫配置文件和C語言源文件
  • 5.在程序運行時加載so庫
  • 6.運行程序 自動生成so庫

as中開發(fā)jni

第一種開發(fā)方式

  • 1.定義本地方法

    • public native String hello();
  • 2.在工程下創(chuàng)建jni目錄

  • 3.創(chuàng)建hello.c源文件

  • 4.創(chuàng)建Android.mk文件

  • 5.創(chuàng)建Application.mk文件

  • 6.進入到j(luò)ni目錄執(zhí)行ndk-build命令生成so庫(libs)

  • 7.指定so路徑 在module的build.gradle下

      sourceSets{
              main{
                  jniLibs.srcDirs=['libs']
              }
          }
    
  • 8.程序運行時加載so庫

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

as結(jié)合ndk開發(fā)

  • 1.配置ndk路徑

    • 工程結(jié)構(gòu)-ndk路徑(自己下載)
  • 2.定義本地方法

  • 3.創(chuàng)建jni folder

  • 4.編寫C語言源文件

  • 5.module的build.gradle下defaultConfig標(biāo)簽下

      ndk{
              moduleName "hello"  #庫名
              abiFilters "armeabi","armeabi-v7a","x86"  #平臺
          }
    
  • 6.程序運行時加載so庫

  • 7.運行生成so庫

    • so庫在build-中間文件-ndk-debug-lib
      android.useDeprecatedNdk=true

Cmake方式開發(fā)jni 跨平臺

  • 1.定義本地方法

  • 2.main下創(chuàng)建cpp目錄

  • 3.cpp下創(chuàng)建C語言源文件

  • 4.創(chuàng)建CMakeLists.txt

      cmake_minimum_required(VERSION 3.4.1)
    
      add_library( # 指定生成的庫名
                   hello
      
                   # 指定生成動態(tài)庫
                   SHARED
      
                   #指定編譯的源文件  如果有多個源文件需要全路徑拷貝依次排開
                   src/main/cpp/hello.c )
      
      
      #查找jni環(huán)境提供的庫
      find_library( # Sets the name of the path variable.
                    log-lib
      
                    # Specifies the name of the NDK library that
                    # you want CMake to locate.
                    log )
      
      
      # 鏈接庫
      target_link_libraries( # 鏈接自己生成的庫 和上面生成的庫名保持一致
                            hello
      
                             # 鏈接log庫
                             ${log-lib} )
    
  • 5.關(guān)聯(lián)CMakeLists.txt

    • 右鍵mudole-Link C++ project with gradle-選擇CMakeLists.txt路徑
  • 6.指定生成的平臺 在build.gradle的defaultConfig

    • externalNativeBuild {
      cmake {
      abiFilters "armeabi","armeabi-v7a","x86"
      }
      }
  • 7.加載so庫

  • 8.運行生成so庫 build-中間文件-cmake-debug-obj

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眉踱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谈喳,更是在濱河造成了極大的恐慌,老刑警劉巖赏僧,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扭倾,死亡現(xiàn)場離奇詭異,居然都是意外死亡驾中,警方通過查閱死者的電腦和手機模聋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來持痰,“玉大人祟蚀,你說我怎么就攤上這事割卖∫萍簦” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵剿涮,是天一觀的道長攻人。 經(jīng)常有香客問我,道長怀吻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任猿棉,我火速辦了婚禮屑咳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兆龙。我一直安慰自己,他們只是感情好慰安,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布聪铺。 她就那樣靜靜地躺著,像睡著了一般锣杂。 火紅的嫁衣襯著肌膚如雪番宁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天蝶押,我揣著相機與錄音,去河邊找鬼茎截。 笑死,一個胖子當(dāng)著我的面吹牛企锌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陡鹃,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼抖坪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脊阴?” 一聲冷哼從身側(cè)響起蚯瞧,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埋合,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡西设,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年答朋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禽绪。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡洪规,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斩例,到底是詐尸還是另有隱情,我是刑警寧澤础钠,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站旗吁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏香府。R本人自食惡果不足惜履怯,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柠硕。 院中可真熱鬧运提,春花似錦蝗柔、人聲如沸民泵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞尔。三九已至,卻和暖如春寥假,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枫振。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工萤彩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雀扶。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像窍侧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子伟件,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • _ 聲明: 對原文格式以及內(nèi)容做了細微的修改和美化, 主要為了方便閱讀和理解 _ 一. 基礎(chǔ) Java Nativ...
    元亨利貞o閱讀 5,900評論 0 34
  • 一谴返、NDK產(chǎn)生的背景 Android平臺從誕生起,就已經(jīng)支持C嗓袱、C++開發(fā)习绢。眾所周知,Android的SDK基于J...
    Ten_Minutes閱讀 3,487評論 1 27
  • 本人為初學(xué)者闪萄,文章寫得不好,如有錯誤败去,請大力懟我 或者看這里 如何使用jni進行開發(fā) 本文主要針對Android環(huán)...
    AlbertHumbert閱讀 4,654評論 2 12
  • Android游戲開發(fā)實踐(1)之NDK與JNI開發(fā)02 承接上篇Android游戲開發(fā)實踐(1)之NDK與JNI...
    AlphaGL閱讀 3,744評論 0 24
  • 宋芷晗搬了小凳在走廊里認真寫作業(yè)圆裕,前方正在建設(shè)大樓,轟轟的聲音震天吓妆,宋芷晗一直在這樣的環(huán)境下學(xué)習(xí),上次考試...
    容蘭之葉閱讀 501評論 4 5