最新版Android Studio 创建JNI教程

本文主要目的如题所示,并针对一些创建过程中可能会遇到的问题提供解决方案。

本文主要参考:http://ph0b.com/android-studio-gradle-and-ndk-integration/,里面有视频讲解,嫌看文档麻烦

的可以直戳进去。。。

主要思路:在一个类中创建native方法,编译生成该类的class文件,再去生成该类的头文件,有了头文件之后在c文件中编写代码的具体实现,配置sdk、ndk路径、给ndk模块起名,最后就是对该方法的调用。

详细步骤如下:

1、本地创建native方法

新建一个空的android工程,在类中声明native方法

建议:不在activity中声明native方法,一是为了设计上的简洁并功能分离,二是创建头文件时避免不要的麻烦。

public class JniUtil {
    public native String getStringFromNative();
}

2、编译

如图,主要是为了得到带有native方法类的.class文件

编译通过之后如下图所示

在此目录下会出现JniUtil.class文件。

3、制作JniUtil.class的头文件

3.1打开terminal终端,主要有两种方法:

3.1.1.菜单栏View视图下,选择tool windows,再点击terminal即可进入

3.1.2.快捷键进入

3.2 jni生成头文件

终端进入app\src\main文件下,再输入以下指令(javah及以后),如图

主要格式为 javah –d –jni –classpath,

不熟悉javah指令的朋友可以输入javah -help帮助下。

-o <file>                输出文件 (只能使用 -d 或 -o 之一)                                         
-d <dir>                 输出目录                                                                  
-v  -verbose             启用详细输出                                                              
-h  --help  -?           输出此消息                                                                
-version                 输出版本信息                                                              
-jni                     生成 JNI 样式的标头文件 (默认值)                                          
-force                   始终写入输文 件                                                                                                               
-classpath <path>        从中加载类的路径

路径介绍:  e:\android-sdks\platforms\android-23\android.jar  为此android工程所依赖的sdk版本,最终锁定到android.jar文件; ..\..\build\intermediates\classes\debug com.example.hitman.final.JniUtil代表生成头文件所依据的.class文件.两个路径中间要用英文分号隔开

成功之后会看到main文件夹下多出一个-jni文件(有的可能直接生成jni文件夹)。里面有编译好的头文件

可能遇到的问题:

1)、某些类文件找不到  更多情况下是在activity中直接声明native方法导致的,由于AS工程依赖的android版本比较高,这就导致e:\android-sdks\platforms\android-23\android.jar 中没有所需的类,即javah –d找不到所需路径。以下文为例

import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {

}

这种情况会导致appCompatActivity找不到,因为e:\android-sdks\platforms\android-23\android.jar 路径中没有这个类,appCompatActivity的实际路径是 E:\android-sdks\extras\android\m2repository\com\android\support \appcompat-v7\23.1.1(本人路径)

解决方案:将native方法迁出activity中,此方法笔者编译一次通过或者将public class MainActivity extends AppCompatActivity 改为public class MainActivity extends Activity 。

3.3创建.c文件,一定要在jni文件夹中

这时我们要注意,将-jni文件夹改名为jni,否则编译时build文件下不能生成ndk库(笔者遇到过这个问题),改名后再jni文件夹下新建.c文件,任意取名为main.c。内容下图所示:

#include <com_example_hitman_finaljni_JniUtil.h>

JNIEXPORT jstring JNICALL Java_com_example_hitman_finaljni_JniUtil_getStringFromNative
        (JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"HELLO FROM NATIVEJNI");
};

注意事项:一定要添加新建的头文件,如蓝色文字所示。

可能遇到问题:有些AS的bug必须要创建两个.c文件才能编译成功。

关于.c文件的语法问题可参考http://blog.chinaunix.net/uid-26000296-id-5296362.html

4、配置sdk、ndk路径,并编译

4.1打开local.propertiesZ文件

ndk.dir=E\:\\android-sdks\\ndk-bundlesdk.dir=E\:\\android-sdks

4.2设置好路径之后编译一下就能看到build问价下的ndk中的库了

可能遇到的问题

Error:Execution failed for task ‘:app:compileDebugNdk‘.
> Error: NDK integration is deprecated in the current plugin.  Consider trying the new experimental plugin.  For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental.  Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

这个可以在在gradle.properties 文件里面添加 android.useDeprecatedNdk=true 后重新编译即可

5、给自己的库取名字并在activity中调用native方法

5.1在app目录选的build.gradle中添加ndk

5.2加载本地库,并调用native方法

只需在activity中调用TextView.setText()方法就可以了。代码如下

public class MainActivity extends AppCompatActivity {
    static{
        System.loadLibrary("MyLib");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);
        TextView txt=(TextView)findViewById(R.id.txt);
        JniUtil util=new JniUtil(this);
        txt.setText(util.getStringFromNative());
            }
        });
    }
}

至此,确保编译通过就能能正常运行,模拟器效果图如下:

如有问题、意见或者建议的欢迎留言交流。

时间: 2024-10-23 03:39:12

最新版Android Studio 创建JNI教程的相关文章

[Learn Android Studio 汉化教程]第四章 : Refactoring Code

[Learn Android Studio 汉化教程]第四章 : Refactoring Code 第四章 Refactoring Code    重构代码 在Android Studio中开发,解决方案不会总是一蹴而成的.作为一个有效率的编程者,在你的开发,调试和测试中需要一些弹性以及代码重构.随着在这章中的行进,你将明白Android Studio如何产生代码:在这章里你将看到Android Studio如何重构你的代码.重构代码最大的风险是可能引入不期望的错误.通过分析某些风险重构操作的结

第五章:Reminders实验:第一部分[Learn Android Studio 汉化教程]

Learn Android Studio 汉化教程 By now you are familiar with the basics of creating a new project, programming, and refactoring.It is time to create an Android application, otherwise known as an app. This chapter introduces the first of four lab projects.

Android Studio创建Android Library发布至本地仓库

本文通过Android Studio创建一个Android Library项目,然后发布到本地的Maven仓库. 1.创建Android Library模块 2.配置build.gradle apply plugin: 'com.android.library' apply plugin: 'maven' android {     compileSdkVersion 21     buildToolsVersion "21.1.2"     defaultConfig {      

Android Studio创建项目

创建项目 首先,先指出Android Studio中的两个概念. Project 和 Module .在Android Studio中, Project 的真实含义是工作空间, Module 为一个具体的项目. 在 Eclipse 中,我们可以同时对多个 Eclipse 的 Project 进行同时编辑,这些 Project 在同一个 workspace 之中.在Android Studio中,我们可以同时对多个Android Studio的 Module 进行同时编辑,这些 Module 在同

android studio创建模拟器报错解决 emulator: ERROR: This AVD&#39;s configuration is missing a kernel file!!

android studio创建模拟器报错 emulator: ERROR: This AVD's configuration is missing a kernel file!! 的解决办法 原因有二:1 没有,解决办法通过sdk mangager 下载 2 找不到,解决办法看系统环境变量path(此种情况多数发生在android Studio和EclipseADT同时存在的情况下) 原因是在刚刚安装完毕的androidstudio的sdk目录下没有system-image目录,也许有但没有相

Android Studio创建库项目及引用

Android Studio创建库项目其实创建的是在主项目下创建Module模块,这个Module模块创建的时候选择库项目模式. 为什么要这样处理呢?因为在Android Studio中一个WorkSpace工作空间就是一个Android主项目.主项目其实也就是这个工作空间的一个Module模块,只不过这个模块是一个主模块.如果要想创建库项目,显而易见也应该是一个module模块项目,设置成Library就可以了. 然后自动生成的build.gradle文件里面会有一行标示 apply plug

用android studio创建第一个安卓程序加载html5 页面

前言 软件版本:android studio v1.0正式版,由于v0.x以来软件变化一直比较大,很多问题搜索的解决方案也都是v0.x版本时代的,故首先声明一下版本. 动机:由于工作中需要对移动端软件开发的几种方式进行一下对比研究,故有了此文章的产生,估计后续还会有其他技术方案的文章发布. 目标:为了适应跨平台的要求,所以用html5编写页面,利用webview装载html5页面就成为了一个备选的技术路线.本篇文章就是利用android studio创建一个apk程序,装载编写好的html5页面

使用Android Studio创建Android项目

创建项目 首先,在Android Studio中: Project 和 Module, Project 的真实含义是工作空间, Module 为一个具体的项目. 在 Eclipse 中,可以同时对多个 Eclipse 的 Project 进行同时编辑,这些 Project 在同一个 workspace 之中.在Android Studio中,我们可以同时对多个Android Studio的 Module 进行同时编辑,这些 Module 在同一个 Project 之中. Eclipse 的 Pr

使用Android studio创建你的第一个项目

1.创建HelloWorld项目 任何编程语言写出的第一个程序毫无疑问都会是Hello World,这已经是自20世纪70年代一直流传下来的传统,在编程界已成为永恒的经典,那么今天就来使用Android studio创建第一个app(Hello World). 首先运行Android studio,在弹出的快捷窗口中新建一个项目. 点击上面截图中的"Star a new Android Studio project",然后会弹出"Create New Project"