AS jni调用入门(附图)

转载 2016年05月30日 13:20:17

如题AS调用jni示例:

一、AS环境配置

1、初始步骤:本人开发环境为AS2.1.1

2、下载NDK,SDK没有下载的小伙伴就自行解决吧(没有NDK的小伙伴在红框的位置会有下载地址,可自行下载)


3、如果没有真机的小伙伴可以下载Genymotion模拟器,安装流程网上大把,有真机的可以忽略。

基础配置基本就这些,下面进行记录下我的第一个NDK项目,附和网上的大篇文章类似,不同在于我会把bug以及详细解决方案给出

二、创建项目

1、这步没什么好说的,new个android 的项目就ok

2、新建文件


public class JniTest {
    static{
        System.loadLibrary("JniTest");//jni模块加载名称
    }
    public native String getJniString();//该方法是红色的,暂时不用理会
}

3、编译生成.class文件


生成目录

4、生成.h文件

(1)首先进入打开Terminal,进入对应的工程目录下,访问build/intermediates/classes/debug目录下



(2)生成头文件,java的环境变量配置这里就不说了,网上一大把,执行命令后不会马上看见.h文件,关闭下debug文件,再重新打开,我们.h文件就会看到了

(3)新建一个jni的存放目录,如图点击后选择finish即可,如果想改变存放目录可根据自己需求操作,然后将刚刚生成的.h文件copy过来,然后新建cpp文件,文件名称随意,然后需要我的操作是copy了一份已经调试成功的c代码片段进行改正如图:


红色部分就是我们要改正的部分,改正后如图:

1、include的替换成我们自己的.h文件名称

2、c代码方法名也对应换成我们.h文件中的方法名

改正后代码:

#include "com_wang_ndk_JniTest.h"
/*
 * Class:     com_wang_ndk_JniTest
 * Method:    getJniString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_wang_ndk_JniTest_getJniString(JNIEnv* env, jobject obj) {
    return env->NewStringUTF("Hello from JNI !");
}

(5)OK到此步骤我们基本都搞定了,感觉比eclipse简单好多,我们下一步要生成.so文件,麻烦的问题来了,不是操作的多麻烦,而是会遇到各种离奇的bug,我们就根据bug提示进行依次修改。

首先进行.so的编译生成,重新build下

1、第一个bug提示

Error:(12, 0) 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.

解决方案:根据bug提示的内容进行配置,配置OK后继续编译


2、第二个bug个有点奇怪,不是每次都出现,如果出现的小伙伴可按这种方式处理。编译过程种提示我无法删除debug文件,根据提示找到了classes下的debug文件,是一个空文件夹,果断删除,却提示我IO异常,最后的解决方法就是关掉AS,去工程文件下把debug文件找到并删除,然后重新进来后再编译,这样就Ok了






3、注意细节的小伙伴已经发现原先我们新建的JniTest类的方法是提示红色的,现在已经没有了,之后我再gradle中加入调用模块名称

此名称应与loadLibaray种调用的名称一致

static{
    System.loadLibrary("JniTest");//jni模块加载名称
}

4、调用,运行OK





第一次尝试使用 AS 调用JNI~

最近项目需要用到NDK编程,要学会如何在AS里调用 jni ,走了不少坑,下面就把自己的心路历程写下来,做个记录。 第一步,下载NDK ,建议下载 最新的包,android-ndk-r12b ,开始...
  • AnJingZuo
  • AnJingZuo
  • 2016年07月15日 16:26
  • 1165

AS2.2使用CMake方式进行JNI/NDK开发

之前写过一篇比较水的文章Android手机控制电脑撸出HelloWorld 里面用到了JNI/NDK技术。这篇文章给大家介绍下JNI/NDK开发。采用的是Android Studio2.2开发环境...
  • yulianlin
  • yulianlin
  • 2016年11月15日 10:06
  • 6197

使用ndk-build方式在as调用jni

在比较新的as上,调用jni有一些比较方便的方式比如使用cmake或者使用build工具,参考我博客中其他几篇文章 http://blog.csdn.net/findsafety/article/de...
  • findsafety
  • findsafety
  • 2017年05月16日 17:52
  • 408

eclipse as android jni 和 ndk以及调用过程--tread

乱叨叨 Eclipse 配置 1下载所需要的ndk版本 2新建一个Android工程 3编写java类对CC 进行调用 4生成h头文件 5根据头文件编写自己的cc文件并编译 6编译多个源文件 7面向多...
  • oZuiJiaoWeiYang
  • oZuiJiaoWeiYang
  • 2016年03月10日 17:02
  • 1548

JNI调用C++动态链接库入门

  • 2012年03月15日 17:24
  • 158KB
  • 下载

Android 6.0 AS平台 JNI 实验

  • 2017年04月13日 15:04
  • 26.62MB
  • 下载

AS CMake JNI Demo

  • 2018年01月09日 15:39
  • 16.32MB
  • 下载

java jni 入门1 - 一个简单的从Java程序中调用C函数

参考:《JAVA核心技术 卷II:高级特性》第12章 本地方法 ######################################################3 使用本地代码...
  • u012005313
  • u012005313
  • 2015年11月08日 15:46
  • 4105

NDK开发 从入门到放弃(四:JNI函数、C与C++调用函数的区别)

JNI入门级函数、C与C++调用JNI函数的区别
  • xiaoyu_93
  • xiaoyu_93
  • 2016年11月02日 16:46
  • 1095

Android底层调用的入门---JNI实践

一、前言 众所周知,android系统不能直接控制底层硬件,像单片机那样简单的点个LED灯对于安卓系统来说可没那么简单,那么它是用什么方式来操作底层接口呢?本文对此一一进行探讨。二、JNI是Andro...
  • MENGHUANBEIKE
  • MENGHUANBEIKE
  • 2017年04月06日 00:45
  • 269
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AS jni调用入门(附图)
举报原因:
原因补充:

(最多只允许输入30个字)