Android入門筆記12
交叉編譯
- 在一個平臺下,編譯出另一個平臺能夠執行的二進位制的程式碼
- 平臺:windows,mac os,linux
- 處理器:x86,arm,mips
交叉編譯的原理
- 原始碼->編譯->連結->可執行程式
- 模擬其他平臺的特性
交叉編譯的工具鏈
- 多個工具的集合,一個工具使用完後接著呼叫下一個工具
常見工具
- NDK:native developement kit:開發jni必備,就是模擬其他平臺特性來編譯程式碼的工具
- CDT:C/C++ developement tools:高亮顯示c語言關鍵字
- cygwin:一個模擬器,可以再windows下執行linux指令
NDK目錄結構
- docs:幫助文件
- build/tools:linux的批處理檔案
- platforms:編譯c程式碼需要使用的標頭檔案和類庫
- prebuilt:預編譯使用的二進位制可執行檔案
- sample:jni的使用例子
- source:ndk的原始碼
- toolchains:工具鏈
- ndk-build.cmd:編譯打包c程式碼的一個指令
使用jni
-
在專案根目錄下建立jni資料夾
-
在jni檔案中建立一個c檔案
-
在java程式碼中,建立一個本地方法helloFromC
public native String helloFromC();
-
在jni中定義函式實現這個方法,函式名必須為
jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)
-
返回一個字串,用c定義一個字串
char* cstr = "hello from c";
-
把c的字串轉換成java的字串
jstring jstr = (*env)->NewStringUTF(env, cstr); return jstr;
-
在jni中建立Android.mk檔案
-
在c檔案中新增<jni.h>標頭檔案
-
在jni資料夾下執行ndk-build.cmd指令
-
java程式碼中載入so類庫,呼叫本地方法
常見錯誤
-
findLibrary returned null
- CPU平臺不匹配
- 載入類庫時,寫錯類庫名字
-
本地方法找不到
- 忘記載入類庫
- c程式碼中方法名寫錯了
javah
*1.7:在src目錄下執行javah 包名.類名
*1.6:在bin/classes目錄下執行
javap
- 在bin/class目錄下執行javap -s 包名.類名
- 列印方法簽名
C向C++改造
- 把c檔案字尾名換成cpp
- Android.mk檔案中的hello.c也要換成hello.cpp
- c++的使用的環境變數結構體中,訪問了c使用的結構體的函式指標,函式名全部都是一樣的,只是引數去掉了結構體指標
- 訪問函式指標時,把env前面的*號去掉,因為此時env已經是一級指標
- clean,清除之前編譯的殘留檔案
- 把宣告函式的h檔案放入jni資料夾中,include該h檔案
相關文章
- vue 基礎入門筆記 12Vue筆記
- vue 基礎入門筆記 12:元件切換Vue筆記元件
- ClickHouse入門筆記筆記
- vue入門筆記Vue筆記
- Docker 入門筆記Docker筆記
- spark入門筆記Spark筆記
- Redis入門筆記Redis筆記
- NPM入門筆記NPM筆記
- NSIS入門筆記筆記
- Go入門筆記Go筆記
- linux入門筆記Linux筆記
- Python入門筆記Python筆記
- Python 入門筆記Python筆記
- selenium 入門筆記筆記
- ByteBuddy入門筆記筆記
- Haskell 入門筆記(四)Haskell筆記
- Swift快速入門筆記Swift筆記
- JavaScript入門筆記(2)JavaScript筆記
- 【安卓筆記】ormlite入門安卓筆記ORM
- MySQL入門筆記2MySql筆記
- TS入門學習筆記筆記
- python入門筆記1Python筆記
- Golang 基礎入門筆記Golang筆記
- 【PostgreSQL】入門學習筆記SQL筆記
- es6 入門筆記筆記
- MyBatis-Plus筆記(入門)MyBatis筆記
- TypeScript 入門自學筆記(一)TypeScript筆記
- git入門學習筆記Git筆記
- Docker入門學習筆記Docker筆記
- XStream入門使用筆記筆記
- Unity學習筆記--入門Unity筆記
- 快應用入門筆記筆記
- Unix 入門經典 筆記筆記
- EntityFramework Core筆記:入門(1)Framework筆記
- Hibernate快速入門筆記筆記
- ReactNative快速入門筆記React筆記
- webpack入門筆記——其他配置Web筆記
- 【安卓筆記】gradle入門安卓筆記Gradle