最近需要研究如何快速定位以及防护安卓native的crash相关知识,故此产生了这篇有关搭建jni环境的文章。
-
新建一个hello world工程,这个相信大家都会;
-
在新建工程中的MainActivity类中添加如下代码:
static { System.loadLibrary("MyJni");//导入生成的链接库文件 } public native String getStringFromNative();//本地方法
-
在Perferences->Tools->External Tools下面添加如下两个配置:
上图中的Arguments为:-classpath . -jni -d
M
o
d
u
l
e
F
i
l
e
D
i
r
ModuleFileDir
ModuleFileDir/src/main/jni
F
i
l
e
C
l
a
s
s
FileClass
FileClass,Working directory为:
M
o
d
u
l
e
F
i
l
e
D
i
r
ModuleFileDir
ModuleFileDir/src/main/Java。
上图中的Program为你的ndk-build.cmd所在路径,我的路径为/Users/admin/Library/Android/sdk/ndk-bundle/ndk-build,Working directory为: M o d u l e F i l e D i r ModuleFileDir ModuleFileDir/src/main/jni。
-
右键点击工程中的MainActivity类文件,选择External Tools->javah,这个时候会在src->main->jni目录下生成相应jni的.h文件。
-
在jni目录下面新建test.c文件,添加如下代码:
// // Created by admin on 2019/2/15. // #include<jni.h> #include<stdio.h> //导入我们创建的头文件 #include "com_example_admin_test_MainActivity.h" JNIEXPORT jstring JNICALL Java_com_example_admin_test_MainActivity_getStringFromNative (JNIEnv *env, jclass jclass){ //返回一个字符串 return (*env)->NewStringUTF(env,"This is my first NDK Application"); }
-
在jni目录下面新建Android.mk文件,添加如下代码:
其中MyJni为so文件名称,test.c为需要编译的.c源文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := MyJni LOCAL_SRC_FILES := test.c include $(BUILD_SHARED_LIBRARY)
-
在jni目录下面新建Application.mk文件,添加如下代码:
表示生成适配所有机型架构的.so文件
APP_ABI := all
-
将MainActivity中的代码改成如下:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ((TextView)findViewById(R.id.textview)).setText(getStringFromNative()); } static { System.loadLibrary("MyJni");//导入生成的链接库文件 } public native String getStringFromNative();//本地方法 }
-
在app的build.gradle文件的android中添加如下代码:
sourceSets { main() { jniLibs.srcDirs = ['src/main/libs'] jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程 } }
-
在工程的grade.properties文件中添加如下代码:
android.useDeprecatedNdk=true
-
右键点击jni目录,选择External Tools->ndk-build,这个时候会在和jni同目录的libs和obj中生成相应的.so文件。其中obj中的.so文件是包含调试信息的,libs中的.so文件不包含。
完成以上步骤之后,点击运行,工程就能正常跑起来了。
注:
在mac电脑上,需要配置adb、ndk-build的环境,否则会报command not found,步骤如下:
启动Mac自带的终端Terminal;
进入当前用户的home目录:在命令行输入echo $HOME;
创建.bash_profile文件:命令行输入touch .bash_profile;
打开.bash_profile文件:命令行输入open -e .bash_profile此命令行输入完毕后,会自动弹出 .bash_profile 文件的编辑窗口,添加如下信息到文件中export PATH=${PATH}:/Users/admin/Library/Android/sdk/platform-tools:/Users/admin/Library/Android/sdk/tools:/Users/admin/Library/Android/sdk/ndk-bundle,请注意在文件中写的路径和你相应文件放置的路径一致。