Android studio1.5.1 NDK配置开发

注意:因为使用的工具和SDK版本不同,过程可能就不同,我把我试验过的几种情况都会说下。

一、工具和SDK版本:Android studio1.51, SDK版本:23 (最新的6.0)

二、工具和SDK版本:Android studio1.51, SDK版本:21

在这两种情况之前你必须做好一件事:安装NDK。过程如下:

在setting 中appearance -> Android SDK -> SDK Tools -> Android NDk 打钩,然后点击apply -> OK. 如下图:

自动安装好DN卡之后,会在 local.properties 中有显示:如下图

到此ND就安装完成了,那么接下来就是关键时刻了,先来看看情况一的具体过程:

1.  新建一个工程,就是一个简单的空白工程,功能也没有

2.  定义native 接口 和 加载即将生成的库。就几行代码,代码如下:

  1. package zhanghuan.cn.jnitest1;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.widget.TextView;
  5. public class MainActivity extends AppCompatActivity {
  6. static {
  7. System.loadLibrary("JniTest");
  8. }
  9. public native String getStringFromNative();
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. TextView textView = (TextView)findViewById(R.id.text);
  15. textView.setText(getStringFromNative());  // 调用接口
  16. }
  17. }

3. 写好接口之后接下来就是关键了,点击 Build -> Make Project, 如下图:

然后在底部的状态栏Messages 中查看Build的情况,必须是0错误才行,如下图:

4. Build 成功之后,就在Terminal 命令行中开始生成.h 文件

命令为:

  1. javah -d jni -classpath D:\tools\android-sdk\platforms\android-23\android.jar;D:\MyProject\AndroidStudio\JniTest1\app\src\main\java zhanghuan.cn.jnitest1.MainActivity

就是这一步卡了我好久,之前找的教程每个的命令都是这样的:

  1. javah -d jni -classpath D:\tools\android-sdk\platforms\android.jar;..\..\build\intermediates\classes\debug zhanghuan.cn.jnitest1.MainActivity

结果报错  “找不到android.support.v7.app.AppCompatActivity的类文件” 如下图:

怎么试都不成功,最后发现除非不用V7特性,不继承AppCompatActivity 类,继承成普通的Activity就没事,这其中的差异我在后面会说的。但是我想如果在AppCompatActivity不应该不行的,虽然这是新特性,但它肯定能包容以前的。既然在debug 这中找不到,那我就直接在main 中指定类文件,不在debug中找了,结果让我发现居然成功了!当时心里呼了好长的一口气。成功的命令就是上面的第一个命令,直接指向类文件,然后生成了.h 文件,但是这个.h 文件和用debug 中的类文件生成的.h
文件是有区别的,这个区别待会在后面把.h 文件一对比就知道了。

回归正题,命令成功之后,在main 目录下回生成jni目录,然后还有一个.h 文件:如下图:

我贴下.h 文件的代码:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class zhanghuan_cn_jnitest1_MainActivity */
  4. #ifndef _Included_zhanghuan_cn_jnitest1_MainActivity
  5. #define _Included_zhanghuan_cn_jnitest1_MainActivity
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class:     zhanghuan_cn_jnitest1_MainActivity
  11. * Method:    getStringFromNative
  12. * Signature: ()Ljava/lang/String;
  13. */
  14. JNIEXPORT jstring JNICALL Java_zhanghuan_cn_jnitest1_MainActivity_getStringFromNative
  15. (JNIEnv *, jobject);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif

5. 复制.h 文件放在相同的目录下,改个名称(名字任意)为my.c , 代码如下:

  1. #include "zhanghuan_cn_jnitest1_MainActivity.h"
  2. JNIEXPORT jstring JNICALL Java_zhanghuan_cn_jnitest1_MainActivity_getStringFromNative
  3. (JNIEnv * env, jobject job) {
  4. return (*env)->NewStringUTF(env, "Hello form JNI!");
  5. }

但是这时你会发现有错误,NDK support is an experimental feature and all use cases are not yet supported, 如下图:

解决方法是在 gradle.properties 文件中加入一句代码:

  1. android.useDeprecatedNdk=true

6. 在app 中的build.gradle 文件的defaultConfig 中加入NDK配置,指定生成的so文件名和适配的arm 类型. 加入代码:

  1. ndk{
  2. moduleName "JniTest"
  3. abiFilters "armeabi", "armeabi-v7a", "x86"
  4. }

我的build.gradle 文件代码如下:

  1. apply plugin: ‘com.android.application‘
  2. android {
  3. compileSdkVersion 23
  4. buildToolsVersion "23.0.2"
  5. defaultConfig {
  6. applicationId "zhanghuan.cn.jnitest1"
  7. minSdkVersion 11
  8. targetSdkVersion 23
  9. versionCode 1
  10. versionName "1.0"
  11. ndk{
  12. moduleName "JniTest"
  13. abiFilters "armeabi", "armeabi-v7a", "x86"
  14. }
  15. }
  16. buildTypes {
  17. release {
  18. minifyEnabled false
  19. proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
  20. }
  21. }
  22. }
  23. dependencies {
  24. compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
  25. testCompile ‘junit:junit:4.12‘
  26. compile ‘com.android.support:appcompat-v7:23.2.1‘
  27. }

到此,基本步骤就全部完成了,然后就直接运行一下,看下效果,效果图如下:

成功完成!如果有兴趣可以看下下面的第二种情况。

好了,接下来我们就看看第二种情况:不使用V7。

1. 前面的几步步骤和第一种情况是一样的,到第4步的命令行开始有重要的差别, 我就直接跳到命令行那步了,命令如下:

  1. javah -d jni -classpath D:\tools\android-sdk\platforms\android-21\android.jar;D:\MyProject\AndroidStudio\JinTest\app\build\intermediates\classes\debug zhanghuan.cn.jintest.MainActivity

注意如果出错要写绝对的地址,网上的教程都是什么”..\..\buidl\...“这种写法,但是我一次都没成功,折腾了很久都没成功,如果你成功了就请告诉我。

最后生成的.h 文件代码如下:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class zhanghuan_cn_jintest_MainActivity */
  4. #ifndef _Included_zhanghuan_cn_jintest_MainActivity
  5. #define _Included_zhanghuan_cn_jintest_MainActivity
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. #undef zhanghuan_cn_jintest_MainActivity_BIND_ABOVE_CLIENT
  10. #define zhanghuan_cn_jintest_MainActivity_BIND_ABOVE_CLIENT 8L
  11. #undef zhanghuan_cn_jintest_MainActivity_BIND_ADJUST_WITH_ACTIVITY
  12. #define zhanghuan_cn_jintest_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L
  13. #undef zhanghuan_cn_jintest_MainActivity_BIND_ALLOW_OOM_MANAGEMENT
  14. #define zhanghuan_cn_jintest_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L
  15. #undef zhanghuan_cn_jintest_MainActivity_BIND_AUTO_CREATE
  16. #define zhanghuan_cn_jintest_MainActivity_BIND_AUTO_CREATE 1L
  17. #undef zhanghuan_cn_jintest_MainActivity_BIND_DEBUG_UNBIND
  18. #define zhanghuan_cn_jintest_MainActivity_BIND_DEBUG_UNBIND 2L
  19. #undef zhanghuan_cn_jintest_MainActivity_BIND_IMPORTANT
  20. #define zhanghuan_cn_jintest_MainActivity_BIND_IMPORTANT 64L
  21. #undef zhanghuan_cn_jintest_MainActivity_BIND_NOT_FOREGROUND
  22. #define zhanghuan_cn_jintest_MainActivity_BIND_NOT_FOREGROUND 4L
  23. #undef zhanghuan_cn_jintest_MainActivity_BIND_WAIVE_PRIORITY
  24. #define zhanghuan_cn_jintest_MainActivity_BIND_WAIVE_PRIORITY 32L
  25. #undef zhanghuan_cn_jintest_MainActivity_CONTEXT_IGNORE_SECURITY
  26. #define zhanghuan_cn_jintest_MainActivity_CONTEXT_IGNORE_SECURITY 2L
  27. #undef zhanghuan_cn_jintest_MainActivity_CONTEXT_INCLUDE_CODE
  28. #define zhanghuan_cn_jintest_MainActivity_CONTEXT_INCLUDE_CODE 1L
  29. #undef zhanghuan_cn_jintest_MainActivity_CONTEXT_RESTRICTED
  30. #define zhanghuan_cn_jintest_MainActivity_CONTEXT_RESTRICTED 4L
  31. #undef zhanghuan_cn_jintest_MainActivity_MODE_APPEND
  32. #define zhanghuan_cn_jintest_MainActivity_MODE_APPEND 32768L
  33. #undef zhanghuan_cn_jintest_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING
  34. #define zhanghuan_cn_jintest_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L
  35. #undef zhanghuan_cn_jintest_MainActivity_MODE_MULTI_PROCESS
  36. #define zhanghuan_cn_jintest_MainActivity_MODE_MULTI_PROCESS 4L
  37. #undef zhanghuan_cn_jintest_MainActivity_MODE_PRIVATE
  38. #define zhanghuan_cn_jintest_MainActivity_MODE_PRIVATE 0L
  39. #undef zhanghuan_cn_jintest_MainActivity_MODE_WORLD_READABLE
  40. #define zhanghuan_cn_jintest_MainActivity_MODE_WORLD_READABLE 1L
  41. #undef zhanghuan_cn_jintest_MainActivity_MODE_WORLD_WRITEABLE
  42. #define zhanghuan_cn_jintest_MainActivity_MODE_WORLD_WRITEABLE 2L
  43. #undef zhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_DIALER
  44. #define zhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_DIALER 1L
  45. #undef zhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_DISABLE
  46. #define zhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_DISABLE 0L
  47. #undef zhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL
  48. #define zhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
  49. #undef zhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL
  50. #define zhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
  51. #undef zhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SHORTCUT
  52. #define zhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SHORTCUT 2L
  53. #undef zhanghuan_cn_jintest_MainActivity_RESULT_CANCELED
  54. #define zhanghuan_cn_jintest_MainActivity_RESULT_CANCELED 0L
  55. #undef zhanghuan_cn_jintest_MainActivity_RESULT_FIRST_USER
  56. #define zhanghuan_cn_jintest_MainActivity_RESULT_FIRST_USER 1L
  57. #undef zhanghuan_cn_jintest_MainActivity_RESULT_OK
  58. #define zhanghuan_cn_jintest_MainActivity_RESULT_OK -1L
  59. /*
  60. * Class:     zhanghuan_cn_jintest_MainActivity
  61. * Method:    getStringFromNative
  62. * Signature: ()Ljava/lang/String;
  63. */
  64. JNIEXPORT jstring JNICALL Java_zhanghuan_cn_jintest_MainActivity_getStringFromNative
  65. (JNIEnv *, jobject);
  66. #ifdef __cplusplus
  67. }
  68. #endif
  69. #endif

是不是发现和第一种情况生成的.h 文件不同,多了很多的东西。不过这些东西好像然并卵,如果你知道其中的区别还请留言告诉我,非常感谢。

当然了,你还可以用第一种情况中的命令,也是OK的,同时不加上-classpath 和 android.jar,只指定要编译的类文件和.h文件目录就可以,如下:

  1. javah -d jni D:\MyProject\AndroidStudio\JinTest\app\build\intermediates\classes\debug zhanghuan.cn.jintest.MainActivity

-d jni 是指定.h 生成后放的位置,不要自己建也是可以的。

最后生成的.so 文件在 app\build\intermediates\ndk\debug\lib 下,如下图:

到此,全部的情况都已介绍完毕,当然了,如果你在做的时候有问题的话欢迎留言,我们大家一起讨论交流。

时间: 2024-11-01 05:33:14

Android studio1.5.1 NDK配置开发的相关文章

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

     Ps:最近比较闲,so.多更新几篇博客算是总结一下.顺便鄙视一下有的programmer照搬网上面文章,并没有自己去进行相关的实践验证.导致网上面的博客千篇一律,只要最初写博客的人踩坑后面的人全都踩坑.对这类不经过实际检验就大抄特抄的人深深的鄙视一下 ok  接下来我们进入今天的正题,也就是在Android studio里面如何正确的使用和配置ndk.如果有对jni不了解的童鞋建议先去学习下JNI技术再来看本篇博客. 转载请标明出处:http://blog.csdn.net/unrel

android studio ndk配置和ndk开发

配置开发环境: 1:下载ndk,导入android studio中. 2:在项目中引入NDK   3:在计算机path变量中导入NDK路径,在编译.h文件的时候会用到. 一:建立java的native方法,然后编译生成.class文件. 二:根据.class文件生成.h文件. 1:打开Terminal,然后进入APP目录下的main主目录. 2:输入命令. 3:生成.h文件,生成的jni文件夹在main文件夹下. 三:根据.h文件编写.c文件. #include <string.h> #inc

Mac下Android studio 之NDK配置教程

Mac下Android studio 之NDK配置教程(一) 1.概述 最近项目全线转移到Mac下使用使用Android studio开发.遇到关键代码封装到 ***native***层,此时在win下的NDK配置步骤全部失效. 为此,花费了大量时间用来查阅资料,在此,记录下来,分享给大家供以后配置中作为参考. 2.环境 本人使用的开发配置 是:MAC OS 10.10 +androioid studio 1.2+android-ndk-r10e-darwin-x86_64+git .其他配置类

Android开发自学笔记(基于Android Studio1.3.1)—1.环境搭建

一.引言    本套学习笔记的开发环境是Windows 10 专业版和Android Studio 的最新版1.3.1. Android Studio 是一个Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试.    笔者没有怎么使用过Eclipse做Android学习,但是基于Android Studio类似于VS的项目架构,还是偏爱Android Studio这个IDE,没

用C++语言开发Android程序 配置开发环境

如果你是一个C++语言的死忠,你喜欢C++语言到了偏执的状态,如果不想学习Java语言,或者你很讨厌Java语言,如果你认为Java虚拟机的内存占用太多和执行低效.如果你过度关注Andoird程序的执行效率,对Android程序的执行速度过于敏感,喜欢自己用手动档来控制程序的内存和线程等资源,如果你在其他平台下用C++语言开发了一个程序,想要移植到Android平台下,本教程就是为了满足你的以上诸多怪癖而发布的,本文的目的就是指导你学习如何只用C++语言来开发Android程序,而不使用任何其他

[Android NDK/JNI-1A]-开发环境搭建

NDK简介 NDK能干什么:NDK使得在android中,java可以调用C 函数库. 1.Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言.但这并不等同于“第三方应用只能使用Java”. 2.在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,

android studio NDK配置

向您的项目添加 C 和 C++ 代码 本文内容 下载 NDK 和构建工具 创建支持 C/C++ 的新项目 构建和运行示例应用 向现有项目添加 C/C++ 代码 创建新的原生源文件 创建 CMake 构建脚本 将 Gradle 关联到您的原生库 搭配使用 Android Studio 2.2 或更高版本与 Android Plugin for Gradle 版本 2.2.0 或更高版本时,您可以将 C 和 C++ 代码编译到 Gradle 与 APK 一起打包的原生库中,将这类代码添加到您的应用中

Mac下Android studio 之NDK配置教程(一)

Mac下Android studio 之NDK配置教程(一) 1.概述 近期项目全线转移到Mac下使用使用Android studio开发. 遇到关键代码封装到 ***native***层,此时在win下的NDK配置步骤所有失效. 为此,花费了大量时间用来查阅资料,在此,记录下来,分享给大家供以后配置中作为參考. 2.环境 本人使用的开发配置 是:MAC OS 10.10 +androioid studio 1.2+android-ndk-r10e-darwin-x86_64+git . 其它配

Android开发自学笔记(基于Android Studio1.3.1)—1.环境搭建(转)

一.引言    本套学习笔记的开发环境是Windows 10 专业版和Android Studio 的最新版1.3.1. Android Studio 是一个Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试.    笔者没有怎么使用过Eclipse做Android学习,但是基于Android Studio类似于VS的项目架构,还是偏爱Android Studio这个IDE,没