Android开发过程中,经常会遇到和C层交互的情况,本文主要参考了Google开发文档并配合Demo简单讲解下NDK开发入门。
环境配置
首先,需要配置NKD开发环境。在SDK Tools中,下载安装NDK,并添加到环境变量。
新建项目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层的方法,出现红色提示,点击该方法,出现如下:
点击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层展现文本returnValue
.
编译出so文件
编译生成so库,首先需要了解两个文件,Android.mk
和Application.mk
-
Android.mk
:主要是向构建系统描述源文件和共享库,具体语法可以参考文档 -
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
,会发现,在app/src/main目录下会生成对应abi架构的so,其中包换一个obj目录,obj下的和libs下的区别是obj带有调试信息。
Ok,一个简单的NDK demo就这样了。