Android Studio开发JNI工程

使用Android Sutdio创建一个新的工程后,接下来记录创建NDK工程的基本步骤。

本文将达到:

1. 创建NDK工程

2. 在JNI中输出Log语句

3. 指定编译的so库的abi版本

4. 解决在创建NDK工程中的问题

Step: 1. 添加native接口

注意写好native接口和System.loadLibrary()即可了,并无特别之处。

P.S:onCreate()中对R.id.txt执行setText(),所以这里需要对xml布局文件按正常的开发步骤进行修改即可。

直接给出代码如下:

public class MainActivity extends Activity{
    static {
        System.loadLibrary("JniTest");
    }

    public native String getStringFromNative();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView txtView = (TextView) findViewById(R.id.txt);
        txtView.setText(getStringFromNative());
    }
}

Step: 2.执行Build->Make Project

这一步骤执行一下,验证工程中并无其它错误,并对工程进行了编译,生成了.class文件.

.class文件的生成路径是在 app_path/build/intermediates/classes/debug下的.如下图:

Step: 3.javah生成c头文件

点击"View->Tool Windows->Terminal",即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件。

这里需要注意的是要进入 <Project>\app\src\main的目录下执行javah命令,为的是生成的 .h 文件同样是在<Project>\app\src\main路径下,可以在Studio的工程结构中直接看到。

操作命令:

javah -d jni -classpath <SDK_android.jar>;<APP_classes> lab.sodino.jnitest.MainActivity

具体操作图如下:

javah -d jni -classpath c:\Users\sodinochen\AppData\Local\Android\sdk\platforms
\android-16\android.jar;..\..\build\intermediates\classes\debug lab.sodino.jnitest.MainActivity

对于"主版本51比50新,此编译器支持最新的主版本"则是由于电脑上安装了两个版本的jdk引起的,而当前使用的是旧的jdk。

把旧的jdk删除,并执行java version命令后显示当前jdk为最新的1.7时,则不会再有此提示了。如下图:

最后的生成结果:

Step: 4.编辑c文件

在main.c文件中实现头文件中的方法,具体功能为直接return回一个String,并且使用android_log打印出相关日志。

代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>

#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif

/* Header for class lab_sodino_jnitest_MainActivity */

#ifndef _Included_lab_sodino_jnitest_MainActivity
#define _Included_lab_sodino_jnitest_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class: lab_sodino_jnitest_MainActivity
 * Method: getStringFromNative
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_lab_sodino_jnitest_MainActivity_getStringFromNative
  (JNIEnv * env, jobject jObj){
      LOGE("log string from ndk.");
      return (*env)->NewStringUTF(env,"Hello From JNI!");
  }

#ifdef __cplusplus
}
#endif
#endif

到这里后,我们再执行一个"Build->Make Project",发现"Messages Gradle Build"会给出提示如下:

Error:Execution failed for task ‘:app:compileDebugNdk‘.
> NDK not configured.
Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties.
(On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)

这里提示了NDK未配置,并且需要在工程中的local.properties文件中配置NDK路径。好了,提示很清楚了,那我们就进入下一步吧。

Step: 5.配置NDK

这一步包括两个动作:

1.指明ndk路径

2. 修改build.gradle配置

工程中共有两个build.gradle配置文件,我们要修改的是在<Project>\app\build.gradle这个文件。为其在defaultConfig分支中增加上

    ndk {
        moduleName "JniTest"
        ldLibs "log", "z", "m"
        abiFilters "armeabi", "armeabi-v7a", "x86"
    }

以上配置代码指定的so库名称为JniTest,链接时使用到的库,对应android.mk文件中的LOCAL_LDLIBS,及最终输出指定三种abi体系结构下的so库。

添加后如下图:

这时,再执行"Build->Rebuild Project",就可以编译出so文件了。

但在Window平台上会出现一个问题:

Error:Execution failed for task ‘:app:compileDebugNdk‘.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
 D:\Mission\adt-bundle-windows\ndk-r10b\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-21 NDK_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\lib APP_ABI=armeabi,armeabi-v7a,x86
Error Code:
 2
Output:
 make.exe: *** No rule to make target `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni‘, needed by `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni\main.o‘. Stop.

出现这个错误很莫名其妙..几番折腾下,找到一个视频出来了大概原因及解决方式:

出处见Youtube视频 02:50分开始:https://www.youtube.com/watch?v=okLKfxfbz40#t=362

在Windows下NDK一个bug,当仅仅编译一个文件时出现会出现此问题,解决方法就是再加入一个空util.c文件即可。

编译出来的库文件被Studio输出到了下图的路径中

Step: 6.安装运行

界面:

查看Log打印:

时间: 2024-10-11 22:43:49

Android Studio开发JNI工程的相关文章

Android Studio 开发JNI应用

Android的JNI开发主要有两中情况:一种是使用已经编译好的.so动态库:一种是使用c/c++源代码开发.下面分别介绍: 一.使用已经编译好的so 这种情况比较件简单,只要把的.so文件放到相应的目录即可.如下: .[module_name]         . . [src]         . . .[main]         . . . .[jniLibs]         . . . . .[armeabi]         . . . . .[armeabi-v7a]     

Windows下利用Android Studio进行JNI开发准备

因为公司项目需要,要进行jni的开发,进行arr,acr音频格式转化,后期上项目代码,现在先上测试代码 其中参考了http://blog.csdn.net/sodino/article/details/41946607的书写,不过有些说的好含蓄,博主摸索了一个小时,现在把详细的细节分享给大家 首先,要去官方下载ndk,因为博主的机子是win7 64位,博主就贴上这个地址,其余的楼主没有查http://dl.google.com/android/ndk/android-ndk32-r10-wind

《Android Studio开发实战 从零基础到App上线》资源下载和内容勘误

http://blog.csdn.net/aqi00/article/details/72907534 http://blog.csdn.net/aqi00/article/details/73065392 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 资源下载 下面是<Android Studio开发实战 从零基础到App上线>一书用到的工具和代码资源:1.本书使用的Android Studio版本为2.2.3,因为Android官网现在不提供该版本的下载,所以博主

windows平台下Android studio开发环境搭建教程

最近,Google 已宣布,为了简化 Android 的开发力度,以重点建设 Android Studio 工具,到今年年底将停止支持Eclipse等其他集成开发环境 .而随着Android studio正式版的推出和完善,Android开发者们转向Android studio开发平台也将是大势所趋! 小弟Vike原先学习Android也是一直用的eclipse,虽然时间不长,而且用起来慢点,卡点,但是毕竟熟悉起来了,猛地要转到一个新平台,还真是相当不习惯.且不说快捷键有变化,就连Android

使用Android Studio开发android应用(持续更新)

使用Android Studio开发android应用 --------------------转载请注明出处:coder-pig 前言: 在2013年5月16日开发者大会上,google公司发布了一个新的集成开发环境:Android Studio 该IDE是专门用来开发安卓应用程序的,如果你需要使用Java的话就需要下载Java的IDE了! google慢慢地已经把重心放到Android Studio上了,所以有必要熟悉下这个IDE开发环境! 本篇博文会不定期地进行更新!对遇到的问题以及一些新

【移动终端软件开发】2017-2018秋学期教材《Android移动应用设计与开发(第2版)——基于Android Studio开发环境》

经过仔细比较,最终选定2017-2018秋季教材: <Android移动应用设计与开发(第2版)——基于Android Studio开发环境> 出版日期:2017-03-01  书号:978-7-115-44780-7  定价:49.80 元   页数:268 第1章 Android简介 11.1 Android发展概述 11.2 配置开发环境 31.2.1 安装JDK 31.2.2 安装Android Studio 51.2.3 安装SDK 51.3 本章小结 7习题 7 第2章 Andro

Android官方开发文档之从Eclipse迁移到Android Studio开发篇

Android官方开发文档之从Eclipse迁移到Android Studio开发篇 1.前言 从Eclipse迁移项目到Android Studio需要适应一个新的项目结构,建立系统和IDE的功能.为了简化迁移过程,Android Studio提供了重要工具使你可以快速地将现有代码移动到Android Studio项目基础建设的文件和工具. 2.Android Studio的基础(Android Studio Basics) 当你将Eclipse项目迁移到Android Studio时,你应该

Android Studio使用jni、so库

Android Studio使用jni.so库 在Android Studio1.1之后,AS就已经支持jni和so库了,马上发布的1.3正式版,更是可以在clion环境下编译c.c++,更加方便的使用NDK进行开发,网上有很多讲在Android Studio中使用jni的方法,但大多都是在1.1之前的,那时候还没有直接支持jni,所以需要通过给gradle增加task的方式来添加支持.而现在,这一切都不是事!!! 添加lib库 切换到project标签,直接将jar包复制到libs目录下,在添

Android Studio开发环境搭建

现在越来越多的人使用Android studio进行Android应用开发了.掌握Android studio的使用已经是每一个Android开发者必备的技能了. 下面介绍一下如何进行Android studio开发环境的安装. 上面是Android studio的安装介绍,可以看到想要安装Android studio 需要提前安装 JDK 官方推荐安装JDK1.7以上的版本. 安装Android Studio 需要 JDK 和 Android Studio 下载地址分别如下: JDK1.8 6