[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
}
[20]jni
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.