jni环境搭建

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

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

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

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

javah

上图中的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。
ndk-build

上图中的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。

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

  2. 在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");
    }
    
  3. 在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)
    
  4. 在jni目录下面新建Application.mk文件,添加如下代码:

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

    APP_ABI := all

  5. 将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();//本地方法
    }
    
  6. 在app的build.gradle文件的android中添加如下代码:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值