在android開發中如果需要用到c/c++代碼,則需要用到ndk和jni
ndk是一套原生的工具,可以幫助我們在android開發中使用c/c++代碼.
jni(java native interface)java原生介面,規定了java和c/c++互動的規則.
我把ndk開發分為三部分
1. java層代碼
2. c/c++代碼
3. 將c/c++代碼打包為so包(CMake或者ndk-build)
個人理解是java通過so包和so包里面的c/c++代碼互動
**
一.java層代碼
**
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this,getName(),1).show();
}
//指認對應的庫
static {
System.loadLibrary("myjni");
}
//宣告對應庫中要用到的方法
private native String getName();
}
使用javah 來生成jni頭檔案
這里屬實有很多坑啊 直接給出成功案例吧
在代碼的src->main->java 的這個位置 執行代碼
javah -classpath . -jni com.example.myapplication.MainActivity


二.c/c++代碼
**
2.1 jni介面
jni:java native interface java本地介面,用來幫助c/c++對于java的方法,欄位等的訪問.獲取,呼叫等(個人理解)
2.2.ndk靜態注冊的c代碼
ndk的靜態注冊,java和c之間的匹配是通過c檔案中的方法名來辨別的,例如如下的java中的代碼

c端代碼

2.2.1 其中jstring是方法的回傳值型別
2.2.2 方法名中,com_example_myapplication對應的呼叫的java中的路徑
2.2.3 后面的MainActivity對應的類名
2.2.4 最后的methons是在java層對native方法的方法名
ndk靜態注冊:c層通過Java_路徑_類名_java層方法名的命名方法名來和java層的native方法進行匹配(這里的方法名和引數是從jni頭檔案中復制過來的)
三.生成so檔案
這里使用的是ndk-build的方法,需要配置兩個檔案Android.mk和Application.mk 在c代碼同級目錄創建Android.mk和Application.mk檔案
4.1 Android.mk
Android.mk檔案是一個負責向NDK構建系統描述NDK專案的GNU Makefile片段,是每一個NDK專案的必備組件,根據GNU Make的命名規則,變數名要大寫
# Android.mk必須以LOCAL_PATH開頭,注釋#除外
# 設定作業目錄,而my-dir則會回傳Android.mk檔案所在的目錄
LOCAL_PATH := $(call my-dir)
# 借助CLEAR_VARS變數清除除LOCAL_PATH外的所有LOCAL_<name>變數
include $(CLEAR_VARS)
# 設定模塊的名稱,即編譯出來.so檔案名
# 注,要和java代碼中的system.loadlibrary中的名稱相同
LOCAL_MODULE := myjni
# 指定參與模塊編譯的C/C++源檔案串列,多檔案用"\"隔開
LOCAL_SRC_FILES := jj.c
# 必須在檔案結尾定義編譯型別,指定生成的靜態庫或者共享庫在運行時依賴的共享庫模塊串列,
# BUILD_SHARED_LIBRARY 共享庫,供java或者其他共享庫呼叫
# BUILD_STATIC_LIBRARY 靜態庫,供共享庫呼叫,不能直接被java呼叫
include $(BUILD_SHARED_LIBRARY)
這里要修改的就是LOCAL_MODULE和LOCAL_SE_FILES 其他的不用改
4.2 Application.mk
Application.mk檔案配置編譯平臺相關的內容
現在大部分的手機cpu都是armeabi-v7a 一般模擬器使用的是x86
# 最常用的APP_ABI欄位:指定需要基于哪些CPU平臺的.so檔案
# 常見的平臺有armeabi x86 mips,其中移動設備主要是armeabi平臺
# 默認情況下,Android平臺會生成所有平臺的.so檔案,即同APP_ABI := armeabi x86 mips
# 指定CPU平臺型別后,就只會生成該平臺的.so檔案,即上述陳述句只會生成armeabi平臺的.so檔案
# APP_ABI := armeabi armeabi-v7a mips x86
APP_ABI := all
APP_PLATFORM := android-23
在當前目錄打開命令視窗,執行ndk-build 即生成so檔案
**
四.配置專案并運行
**
將在第三步生成的so檔案放入src同目錄的libs中并在model的build.gradle中配置
android{
...
sourceSets {
main() {
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
......
}
配置完成后即可運行
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/277053.html
標籤:其他
上一篇:bmob使用時遇到的問題
