Android Studio上面使用Ndk JNI 开发工程

     Ps:最近比较闲,so.多更新几篇博客算是总结一下.顺便鄙视一下有的programmer照搬网上面文章,并没有自己去进行相关的实践验证.导致网上面的博客千篇一律,只要最初写博客的人踩坑后面的人全都踩坑.对这类不经过实际检验就大抄特抄的人深深的鄙视一下

ok  接下来我们进入今天的正题,也就是在Android studio里面如何正确的使用和配置ndk.如果有对jni不了解的童鞋建议先去学习下JNI技术再来看本篇博客.

转载请标明出处:http://blog.csdn.net/unreliable_narrator?viewmode=contents

老规矩,我们先来看看实现的效果:点击按钮就会调用c代码的方法,这里C代码的方法会返回一个字符串,我们将这个字符串进行展示.

         准备工作:首先我们来看看进行jni开发都需要哪些东西:Android studio1.51(正式版),android-ndk-r11b(http://www.androiddevtools.cn/下载地址),程序员一只.准备工作是将将ndk下载下来配置好NDK-HOME(方法和JAVA-HOME配置雷同,故不做赘述,不会自行百度,据说也可以不用配置(⊙﹏⊙)).

下面开始手把手教程

1.首先使用Android studio创建一个android工程.并且关联上ndk.这里关联的方式有两种一种是在工程设置里面进行配置,另外的一种是在工程目录的local.properties里面配置ndk的路径,两种方式选其中一种即可如下图所示:

(方案一)

(方案2)

   2.打开 grade.properties 文件,在末尾添加:android.useDeprecatedNdk=true.

3.然后在模块的build.gradle文件里面进行ndk参数的配置.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.dapeng.ndkdemo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        ndk {
            moduleName "MyJniLibName"            //生成的so名字(可自己进行指定)
            abiFilters "armeabi", "armeabi-v7a", "x86"    //输出指定三种abi体系结构下的so库。目前可有可无(默认是全选的)。
            //ldLibs "log"                                //如果要使用log就把这个加上
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
}

4.创建一个类编写调用c代码的方法.然后rebuild项目.加载库的名字就是上面我们在buil.gradle里面配置的moduleName.调用c代码的方法必须要用native进行修饰.(这里需要注意的是不能在里面写中文,包括注释,否则生成头文件会报错误:
编码GBK的不可映射字符           )

public class JniUtils {
    static {
        System.loadLibrary("MyJniLibName");
    }

    public native String getStringFromC();
}

5.待工程build完毕以后,进入到如下图所示的debug文件夹查看是否生成了我们编写的类对应的.class文件.目录如下.

6. 如果正确的生成了class文件,接下来生成头文件.打开android studio的terminal(android
studio自带的控制台,在win10上面需要进行设置才能正常的输入,具体方式问度娘)或者是cmd控制台.使用jdk的生成工具生成头文件.先cd到我们的模块的java文件夹下,然后使用javah
-jni +调用C代码的类的全路径名称
.这里千万要看清楚是在哪个路径下编译生成的.生成好以后就可以在工程目录下看到.h格式头文件.(仔细看我贴出来的路径,app就是模块名)

7.依次点击工程new-folder-jnifolder生成jni文件夹(也可以自己在java包的同级目录下直接创建jni文件夹),在jni文件夹里面创意一个任意名称且是以.c格式结尾的文件.将刚刚生成的.h头文件里面的内容复制到.c文件里面并且进行编辑.

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_dapeng_ndkdemo_JniUtils */

#ifndef _Included_com_dapeng_ndkdemo_JniUtils
#define _Included_com_dapeng_ndkdemo_JniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_dapeng_ndkdemo_JniUtils
 * Method:    getStringFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_dapeng_ndkdemo_JniUtils_getStringFromC
        (JNIEnv *env, jobject obj) {
    return (*env)->NewStringUTF(env, "hello java from c");
} ;

#ifdef __cplusplus
}
#endif
#endif

8.最后我们通过JniUtils里面的编写好的方法来调用c代码的方法.就可以了.至此所有代码编写完毕

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.tv);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTextView.setText(new JniUtils().getStringFromC());
            }
        });
    }
}

9.点击rebuild project ,待工程build完毕以后进入到buil的intermediates文件夹下面看看是否生成了ndk文件夹,接着再看看ndk文件夹里面是否有.so文件,如果有就说明大工告成了.that is all. plase enjory it.

时间: 2024-10-17 06:00:24

Android Studio上面使用Ndk JNI 开发工程的相关文章

Android Studio 2.1 NDK断点调试方法

Android Studio 2.1 NDK断点调试方法(基于Android 2.1, gradle 2.1.0) 1.创建一个Android Studio Project 2.设置NDK路径. 菜单中选择: File->Project Structure 在弹出的窗口的左侧选项框中,选择SDK Location,在右侧设置Android NDK location. 2.修改.\build.gradle如下: replase classpath 'com.android.tools.build:

解决Android Studio引入SVN上Eclipse依赖工程不能实时更新的思考

解决Android Studio引入SVN上Eclipse依赖工程不能实时更新的思考 标签(空格分隔): AndroidStudio SVN 使用Android Stuido开发了几个月,都是使用libs/jar实现对外部库的依赖,最近新的需求需要依赖工程.使用SVN进行版本管理,而且依赖工程为Eclipse项目,在开发过程中发现一个问题:作为Module依赖加入的工程,不能直接以new Module的模式从SVN服务器上直接 CheckOut出来作为依赖Module:需要从SVN服务器Chec

【Android Studio(二)】创建工程

Android Studio让你可以很轻松的创建多种类别的安卓应用,比如Phone,table,TV,Wear,Google Glass等.在新建的项目向导中你可以根据你自己的需求创建你所需要的工程. 接下来讲如何在Android Studio中创建一个工程. Step1:创建一个工程 如果你没有可打开的工程,Android Studio开启时是停留在欢迎界面的.这时,如果要创建一个新的工程,点击New Project. 如果你有可打开的工程,Android Studio会直接打开你的工程(这个

【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子

Android 开发了一段时间,一方面 ,感觉不留下点什么.有点对不起自己, 另一方面,好记性不如烂笔头,为了往后可以回头来看看,就当做是笔记,便决定开始写博客.废话不多说 ! 今天想搞一搞 ndk 和jni  ,, 现在开始写一个简单的demo  1. 创建一个新的工程 2. 创建一个新的类 JniText.java  点击Build--Make Project  后     选中工程 点击F4键 sdk location 中 Android ndk location 选择配置ndk 的路径 

android studio(2.0)NDK开发配置

android studio 版本:2.0gradle 版本:2.8 详情看gradle配置: eclipse项目导出============================================================================================= buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:g

cocos2d-x 3.4 + android studio 1.1.0 + VS2012 开发环境搭建

cocos2d-x 是一款跨平台的游戏引擎,虽然现在只学到了一点点皮毛,但是确实感受到了一款游戏引擎的强大功能,让我这个做游戏的小白也算过了一把做游戏的瘾.但是因为配置的复杂性,让我在一开始走了不少弯路,现在记录下来整个安装配置的过程. 安装配置过程中需要用到的安装包主要有下面几个: cocos2d-x 3.4:这个是当然必须要的了,目前最高版本是 3.6 版,但是好像和 3.5 版都有不少问题,还是先用 3.4 吧. android studio 1.1.0:谷歌自己出的 android 集成

Android Studio, gradle and NDK integration

With the recent changes (release 0.7.3 around Dec 27), the new Android Build System starts to be really interesting also if you are using the NDK! Now this is really easy to integrate native libraries in your package and generate APKs for different a

如何在android studio中cordova的混合开发

基于Android Studio 中Cordova的开发 cordova简介 Cordova的前身是PhoneGap 官网: (http://cordova.io) Cordova应是运行在客户端本地应用容器的web应用.因此,运行在Cordova容器中的Html5应用的结构和传统的基于web服务器的有所不同.传统的web应用中服务器端做了大部分工作,比如按照用户请求传回生成的内容.而Cordova这种容器中的应用本身包括了所需要的静态页面,用户请求一般由js代码响应并与服务器交互,这样与服务器

关于Eclipse如何加入Gradle文件与Android Studio两个平台一起开发,工作目录不发生变化

前言: 本来很久之前想弄这玩意,不过因为各种原因,所以没弄. 今天有位前辈提出需求.说想让Eclipse的Android项目逐步走向Android Studio,但是又担心Android Studio一时三刻适应不过来. 说能不能不改变源代码的主要工作目录(在Eclipse的android project root/的 src.res.lib.AndroidManifest.xml四个目录)来在Android Studio上开发呢? 大前提: 我当看到这篇博客的看官已经对Android Stud