NDK工具开发JNI

对于JNI的作用,我这边就不详细说明了,百度google 有很多这样的介绍,这边着重详解AS使用NDK工具开发,调C的流程.

1,创建工程

2,创建native方法

  1. //该类的路径在main目录任意包下即可
  2. public class JniUtils {
  3.    public static native String getStringFromC();
  4. }

3,  配置ndk的路径,如果没有自行到 http://www.androiddevtools.cn/ 下载,或者FQ同步下,自动下载.

4,在app项目下gradle的 defaultConfig{ }内添加

  1. ndk {    
  2.  //生成的so名字
  3.   moduleName "JniDemo"  
  4. }

5,项目的根目录下找到 gradle.properties 添加语句

  1. android.useDeprecatedNdk=true

6,到指定class包的根目录下,使用jni编译h 文件.

  1. //注意这里是包的根目录,而不是class文件的子目录
  2. cd  class文件路径/intermediates/classes/debug

编译h 文件:

  1. //紧接着上一步terminal 编译 h文件
  2. javah  -jni com.relicemxd.jnidemo.ndk.JniUtils
  3. //你也可以指定编译的h 文件到指定目录
  4. javah  -d /这里是app项目的路径/JniDemo/app/src/main/jni -jni com.relicemxd.jnidemo.ndk.JniUtils

7,复制刚生成的 .h文件到 mian/jni 下

下面是.c文件的代码实现:

  1. #include "com_relicemxd_jnidemo_ndk_JniUtils.h"
  2. //这里是C代码的实现
  3. JNIEXPORT jstring JNICALL Java_com_relicemxd_jnidemo_ndk_JniUtils_getStringFromC
  4.        (JNIEnv *env, jclass cls) {
  5.    return (*env)->NewStringUTF(env, "这是来自C的string !");
  6. }
     8,在activity代码中加动态库

static{

System.loadLibrary("JniDemo");//.so文件名,注意这里的名字要与gradle的命名一致

          }

    9,调用native方法

activity调用 native 就可以获取c的输出了.

    10,运行结果

欢迎star, 有问题可以issue.

demo : https://github.com/relice/JniDemo



注意问题:

错误1:未指定类.

原因:

javah 命令执行条件是,包的路径与终端执行的路径一致(不可在子路径下执行)

解决:

cd 进入的路径要在class包下的根目录

错误2: java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String

原因:

javah生成的头文件与 main目录下的头文件不一致.

解决:

step1.则要重新clean project ->build project ,否则项目会有缓存,编译照样报错的.

step2.javah -d 指定scr/mian目录下生成头文件 -jni 包名+类名

NDK工具开发Jni,Android studio jni开发的更多相关文章

  1. NDK开发-Android Studio+gradle-experimental开发ndk

    在最新的Android Studio2.2的preview版中,增加全新的ndk支持,使用了新的gradle,以及DSL语言. 新的NDK需要使用新的Gradle插件和新的Android插件来支持! ...

  2. Android Studio JNI开发入门教程

    Android Studio JNI开发入门教程 2016-08-29 14:38 3269人阅读 评论(0) 收藏 举报  分类: JNI(3)    目录(?)[+]   概述 在Andorid ...

  3. Android开发工具全面转向Android Studio(3)——AS project/module的目录结构(与Eclipse对比)

    如果AS完全还没摸懂的,建议先看下Android开发工具全面转向Android Studio(2)——AS project/module的CRUD. 注:以下以Windows平台为标准,AS以目前最新 ...

  4. Android开发工具全面转向Android Studio(2)——AS project/module的CRUD

    本文有些地方可能需要衔接Android开发工具全面转向Android Studio(1)——准备开发环境,读起来效果会更好. 这个世界很奇妙,所有的东西离不开CRUD,即增删改查.即使人本身也遵循这个 ...

  5. Android Studio 集成开发工具教学视频

    简介 经过2年时间的研发,Google终于正式发布了面向Android开发者的集成开发环境Android Studio 1.2(稳定版).Android Studio是Google开发的一款面向And ...

  6. Google Android Studio Kotlin 开发环境配置

    Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kot ...

  7. Android Studio获取开发版SHA1值和发布版SHA1值,详细过程

    转自原文 Android Studio获取开发版SHA1值和发布版SHA1值的史上最详细方法 前言: 今天我想把百度地图的定位集成到项目中来,想写个小小的案例,实现一下,但在集成百度地图时首先要申请秘 ...

  8. Android Studio 蓝牙开发实例——基于Android 6.0

    因项目需要做一个Android 的蓝牙app来通过手机蓝牙传输数据以及控制飞行器,在此,我对这段时间里写的蓝牙app的代码进行知识梳理和出现错误的总结. 该应用的Compile Sdk Version ...

  9. cordova开发插件,并在android studio中开发、调试

    之前用过cordova Lib包装H5页面,自己写插件,但做法是野路子,不符合cordova插件的开发思路,这次项目又需要包装H5页面,同时需要自定义插件.所以又折腾了一次cordova自定义插件. ...

随机推荐

  1. C# WMI 远程PC(开机、关机、重启)

    啥也不多说,直接上码: //远程重启方法 public static bool Shutdown(ManagementScope scope) { ObjectQuery query=new Obje ...

  2. Jupyter Notebook

    Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言.在本文中,我们将介绍 Jupyter notebook 的主要特性,以 ...

  3. React Native 4 for Android源码分析 一《JNI智能指针之介绍篇》

    文/ Tamic: http://blog.csdn.net/sk719887916/article/details/53455441 原文:http://blog.csdn.net/eewolf/a ...

  4. Objective-C方法与函数的区别

    Objective-C方法与函数的区别 方法是唯对象所有 函数是不依赖于对象存在的 方法 函数 - (void)test; void test(); 方法是以减号 - 开头 - 类型要用()括起来 - ...

  5. Dynamics CRM build numbers

    Dynamics CRM build numbers CRM各大版本及补丁列表,整理的很全

  6. Spark核心类:SQLContext和DataFrame

    http://blog.csdn.net/pipisorry/article/details/53320669 pyspark.sql.SQLContext Main entry point for ...

  7. Retrofit2.0+RxJava+Dragger2实现不一样的Android网络架构搭建

    Tamic :csdn http://blog.csdn.net/sk719887916 众所周知,手机APP的核心就在于调用后台接口,展示相关信息,方便我们在手机上就能和外界交互.所以APP中网络框 ...

  8. Swift基础之Demo包含刷新,加载,网络请求,MVC

    Swift中有一个Alamofire第三方是进行网络请求的,它是AFNetworking的作者写的Swift形式,今天先介绍一下,利用pod导入AFNetworking,SVProgressHUD,M ...

  9. SVN与eclipse整合与使用、SVN与Apache整合

    SVN与eclipse整合 下载SVN插件(http://subclipse.tigris.org) http://subclipse.tigris.org/servlets/ProjectDocum ...

  10. java虚拟机 jvm 局部变量表实战

    java局部变量表是栈帧重要组中部分之一.他主要保存函数的参数以及局部的变量信息.局部变量表中的变量作用域是当前调用的函数.函数调用结束后,随着函数栈帧的销毁.局部变量表也会随之销毁,释放空间. 由于 ...