[20]jni

  •                                  [20]jni

  • c代碼 (編譯、鏈接)

  • 編譯: c源代碼 編譯成2進制文件

  • 鏈接: 根據當前的系統平臺、cpu平臺,加入所能執行的文件庫~~ 生成一個可執行的2

  • 進制文件

  • 電腦 cpu x86(inter amd) 系統指令集不同

  • 手機 cpu arm

  • android手機

  • 系統 linux  arm

  • 交叉編譯: 在一個平臺上(x86) 可以編譯另一個平臺(arm)上可以運行的代碼

  • 工具  NDK (native develop kits )  

  • ndk 必須在linux下運行

  • 當前的操作系統 windows

  • 虛擬機

  • VMWare  

  • Cygwin: 在 windows下 模擬出 linux系統的環境

  • Cygwin 插件的方式安裝組件  

  • C:\cygwin\etc\profile

  • 23行  PATH="/usr/local/bin:/cygdrive/d/android-ndk-r7b:/usr/bin:${PATH}"

  • LOCAL_PATH := $(call my-dir)

  • #指定Android.mk文件的位置  

  • #call my-dir 獲取文件所在目錄

  • #初始化(重置)編譯參數

  • #CLEAR_VARS 清除參數信息

  • include $(CLEAR_VARS)

  • # 定義編譯好的庫文件的名稱

  • LOCAL_MODULE    := Hello

  • # 指定哪些C的源代碼需要編譯

  • LOCAL_SRC_FILES := Hello.c     

  • include $(BUILD_SHARED_LIBRARY)

  • #指定編譯好的庫文件的類型

  • # 有2種類型

  • # BUILD_SHARED_LIBRARY 動態鏈接庫

  • #    擴展名 .so

  • #    庫文件小        程序執行時 所要用到的庫文件(方法) 要用到的時候 纔去加

  • 載(動態) 所記錄只是找到庫的鏈接

  • # BUILD_STATIC_LIBRARY 靜態鏈接庫

  • #    擴展名 .a

  • #    庫文件大        程序執行時 所要用到的庫文件(方法)都進行了封裝,都封裝

  • 到.a 庫文件裏

  • # 動態庫 與 靜態的好處

  • # 動態庫  好: 庫文件小  程序小    壞: 給他人用的時候 容易出錯(對方沒有這

  • 個所指向的庫文件)

  • # 靜態庫 好: 他人用的時候 不會出錯誤   壞:  庫文件大  程序大

  • LOCAL_LDLIBS += -llog

  • #將日誌庫 引入進來 讓c可以打印日誌  liblog.so

  • ndk開發 常見問題

  • 1\ Android.mk   LOCAL_MODULE    := Hell0和 System.loadLibrary("Hello");不是同一個庫

  • 08-09 Caused by: java.lang.UnsatisfiedLinkError:

  • Couldn't load Hello: findLibrary returned null

  • 2、java中的本地方法名 和c中的方法名 簽名不一致

  • 08-09 06:32:27.036: E/AndroidRuntime(449):

  • java.lang.UnsatisfiedLinkError: helloFromC

  • 3、c代碼中 方法 參數沒有補全

  • F:/itcast0605/jni02/code/Ndk/jni/Hello.c:10: error: parameter name omitted

  • 4、在c代碼中  參數類型不一致 想要jstring  我們給的是cstring

  • 畫面一閃 就沒了

  • 5、     代表的就是我們庫掛了~~  c代碼 出現邏輯性的問題

  • 很多行綠色Debug

  • 獲得方法jni頭文件 javah 類名.class

  • 獲得方法的簽名 javap -s 類名.class

  • F:\itcast0605\jni02\code\Callback\bin\classes>javap -s

  • cn.itcast.ndk4.DataProvid

  • er

  • Compiled from "DataProvider.java"

  • public class cn.itcast.ndk4.DataProvider extends java.lang.Object{

  • public cn.itcast.ndk4.DataProvider();

  •   Signature: ()V

  • public native void callback1();

  •   Signature: ()V

  • public native void callback2();

  •   Signature: ()V

  • public native void callback3();

  •   Signature: ()V

  • public void helloFromJava();

  •   Signature: ()V

  • public int Add(int, int);

  •   Signature: (II)I

  • public void printString(java.lang.String);

  •   Signature: (Ljava/lang/String;)V

  • }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章