楼主: z74646
2214 0

[其他] 如何使用Android Studio进行NDK开发 [推广有奖]

  • 0关注
  • 1粉丝

本科生

75%

还不是VIP/贵宾

-

威望
0
论坛币
300 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
890 点
帖子
55
精华
0
在线时间
12 小时
注册时间
2014-2-26
最后登录
2016-7-2

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

Android StudioGoogle推出的高效Android开发工具http://www.*/course/504/,这里将教会大家使用AndroidStudio进行NDK开发


1. 准备工作

在实际写代码之前,首先我们还是需要做一些准备工作:

1.下载NDK开发包:Android官方下载页面

2.配置系统环境变量

下载好NDK开发包之后,直接解压到任意目录,然后需要配置一下系统环境变量,之所以要配置环境变量,是为了方便使用命令ndk-build脚本进行NDK编译。配置参考如下:


Windows系统配置

环境变量 PATH 下追加 :D:\ProgramFile\android-ndk-r11c-windows-x86_64;


MacOS系统配置

mac系统下打开终端,输入:
>touch .bash_profile
>open -e .bash_profile
这样会弹出一个“.bash_profile”文件.


export ANDROID_HOME=/Users/edwin/Library/Android/sdk/
export PATH=${PATH}undefined{ANDROID_HOME}ndk-bundle


2. 项目配置

使用AndroidStudio开发前我们也要做点额外工作,我们需要在项目根目录下local.properties中添加编译NDK的路径:ndk.dir=/Users/liangqi/android-ndk


创建Android.mk 

Android.mk文件用来指定源码编译的配置信息,例如工作目录,编译模块的名称,参与编译的文件等,大致内容如下:


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello_jni

LOCAL_SRC_FILES := hello_jni.c

include $(BUILD_SHARED_LIBRARY)


LOCAL_PATH:设置工作目录,而my-dir则会返回Android.mk文件所在的目录。

CLEAR——VARS:清除几乎所有以LOCAL——PATH开头的变量(不包括LOCAL_PATH)。

LOCAL_MODULE:用来设置模块的名称。

LOCAL_SRC_FILES:用来指定参与模块编译的C/C++源文件名。

BUILD_SHARED_LIBRARY:作用是指定生成的静态库或者共享库在运行时依赖的共享库模块列表。


创建Application.mk

这个文件用来配置编译平台相关内容,我们最常用的估计只是APP_ABI字段,它用来指定我们需要基于哪些CPU架构的.so文件,当然你可以配置多个平台:


APP_ABI := armeabi armeabi-v7a x86 mips



使用gradle脚本  

当然该机器做的事我们还是尽量让机器来做,因此,接下来我打算使用build.gradle来添加一些配置,让Gradle自动帮我完成编译工作,这简直就是爽歪歪啦!

使用gradle,你再也不用手动添加Android.mkApplication.mk文件,一切在build.gradle文件中就都能搞定,在这里我们直接贴出build.gradlendk相关的配置:


android {

    compileSdkVersion 23

    buildToolsVersion "23.0.3"


    defaultConfig {

        applicationId "com.edwin.xxxx"

        minSdkVersion 15

        targetSdkVersion 23

        versionCode 1

        versionName "1.0"

        ndk{

            moduleName "forkApp" //生成的so名字

            ldLibs "log" //Log打印

            abiFilters "armeabi", "armeabi-v7a", "x86"    //输出指定三种abi体系结构下的so库。目前可有可无。

        }

        .....................

        .....................

        .....................

    }

}


3. 补充一些Addroid调用C代码的东西(举例说明)

干货!干货!干货!

监听APP是否被卸载,遗憾的是此方法在API19以后才能使用,哎!

这段代码的原理你需要了解一下fork炸弹(fork bomb

1.在计算机领域中是一种利用系统调用fork(或其他等效的方式)进行的服务阻断攻击;

2.与病毒与蠕虫不同的是,fork炸弹没有传染性,而且fork炸弹会使有进程/程序限制的系统无法开起新工作阶段,对于不限制进程数的系统则使之停止回应;

3.以fork炸弹为代表的自我复制程序有时亦被称为wabbit


#include <jni.h>

#include <stdio.h>

#include <unistd.h>

#include <android/log.h>


#define LOG_TAG "Edwin"

#define LOGD(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)


JNIEXPORT void JNICALL


/**

* 监听软件是否被卸载

* 1.弹出浏览器;

* 2.或者删除SD卡数据.  这个目录APP卸载系统不会自动删除/storage/sdcard/自定义名称文件夹/

*

*/

Java_com_edwin_uninstallapp_MainActivity_uninstallListener(JNIEnv *env, jobject instance) {

    int code = fork();

    if (code > 0) {

        //父进程

        LOGD("parent-->code=%d\n", code);

    } else if (code == 0) {

        //子进程

        LOGD("children-->code=%d\n", code);

        int stop = 1;


        while (stop) {

            //每隔1秒钟判断应用目录是否存在

            sleep(1);

            FILE *file = fopen("/data/data/com.edwin.uninstallapp", "r");

            if (file == NULL) {


                LOGD("uninstall-->code=%d\n", code);

                //TODO 通过Linux命令启动浏览器问卷调查...删除文件等等操作

                execlp("am", "am", "start", "-a", "android.intent.action.VIEW", "-d",

                       "http://wuhaoyou.com/wp/", NULL);

                stop = 0;

            }

        }

    } else {

        //其它

        LOGD("error-->code=%d\n", code);

    }


}




原文来自:博客园/Edwin05


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Android Studio DROID 如何使用 ROI Android 开发 如何

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 03:33