jni环境搭建

最近需要研究如何快速定位以及防护安卓native的crash相关知识,故此产生了这篇有关搭建jni环境的文章。

  1. 新建一个hello world工程,这个相信大家都会;

  2. 在新建工程中的MainActivity类中添加如下代码:

    1
    2
    3
    4
    static {
    System.loadLibrary("MyJni");//导入生成的链接库文件
    }
    public native String getStringFromNative();//本地方法
  3. 在Perferences->Tools->External Tools下面添加如下两个配置:

    javah

    上图中的Arguments为:-classpath . -jni -d \$ModuleFileDir\$/src/main/jni \$FileClass\$,Working directory为:\$ModuleFileDir\$/src/main/Java。

    ndk-build

    上图中的Program为你的ndk-build.cmd所在路径,我的路径为/Users/admin/Library/Android/sdk/ndk-bundle/ndk-build,Working directory为:\$ModuleFileDir\$/src/main/jni。

  4. 右键点击工程中的MainActivity类文件,选择External Tools->javah,这个时候会在src->main->jni目录下生成相应jni的.h文件。

  5. 在jni目录下面新建test.c文件,添加如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //
    // 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");
    }
  6. 在jni目录下面新建Android.mk文件,添加如下代码:

    其中MyJni为so文件名称,test.c为需要编译的.c源文件

    1
    2
    3
    4
    5
    6
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)

    LOCAL_MODULE := MyJni
    LOCAL_SRC_FILES := test.c
    include $(BUILD_SHARED_LIBRARY)
  7. 在jni目录下面新建Application.mk文件,添加如下代码:

    表示生成适配所有机型架构的.so文件

    APP_ABI := all

  8. 将MainActivity中的代码改成如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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();//本地方法
    }
  9. 在app的build.gradle文件的android中添加如下代码:

    1
    2
    3
    4
    5
    6
    sourceSets {
    main() {
    jniLibs.srcDirs = ['src/main/libs']
    jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
    }
    }
  10. 在工程的grade.properties文件中添加如下代码:

    1
    android.useDeprecatedNdk=true
  11. 右键点击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,请注意在文件中写的路径和你相应文件放置的路径一致。

文章目录
|