Android開發(fā)過程中,經常會遇到和C層交互的情況,本文主要參考了Google開發(fā)文檔并配合Demo簡單講解下NDK開發(fā)入門。
環(huán)境配置
首先,需要配置NKD開發(fā)環(huán)境。在SDK Tools中,下載安裝NDK,并添加到環(huán)境變量。
新建項目HelloAndroidJni
- 編輯
gradle.properties
添加:
android.useDeprecatedNdk=true
- 新建NativeObject類,用于JNI訪問
public class NativeObject {
private NativeObject() {
}
private static class SingletonHolder{
static NativeObject sInstance = new NativeObject();
}
public static NativeObject getInstance() {
return SingletonHolder.sInstance;
}
public native String getMsgFromJni();
// new code done
}
getMsgFromJni
方法使我們定義的native層的方法,出現(xiàn)紅色提示,點擊該方法,出現(xiàn)如下:
create_function
點擊Create function Java...后,會在main目錄下'hello-android-jni.c',這里我把c改成cpp
JNIEXPORT jstring JNICALL
Java_com_obito_helloandroidjni_NativeObject_getMsgFromJni(JNIEnv *env, jobject instance) {
return env->NewStringUTF("returnValue");
}
- 加載底層庫到項目中
static {
System.loadLibrary("hello-android-jni");
}
- UI調用JNI方法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.textview);
textView.setText(NativeObject.getInstance().getMsgFromJni());
}
}
編譯運行之后則會在UI層展現(xiàn)文本returnValue
.
編譯出so文件
編譯生成so庫,首先需要了解兩個文件,Android.mk
和Application.mk
-
Android.mk
:主要是向構建系統(tǒng)描述源文件和共享庫,具體語法可以參考文檔 -
Applicatioin.mk
:描述應用需要的原生模塊
在jni目錄下新建Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-android-jni
LOCAL_SRC_FILES := hello-android-jni.cpp
include $(BUILD_SHARED_LIBRARY)
在jni目錄下新建application.mk
APP_STL := stlport_static
APP_ABI := armeabi-v7a x86
最后,打開Terminal,運行ndk-build
,會發(fā)現(xiàn),在app/src/main目錄下會生成對應abi架構的so,其中包換一個obj目錄,obj下的和libs下的區(qū)別是obj帶有調試信息。
Ok,一個簡單的NDK demo就這樣了。