文档章节

Android Studio 下使用JNI运行hello word程序

蜗牛崛起
 蜗牛崛起
发布于 2016/07/27 16:29
字数 497
阅读 41
收藏 2
点赞 0
评论 0

1. 安装和配置NDK

  • 下载NDK,并解压NDK的zip包到非中文目录

  • 配置path : 解压后NDK的根目录

eg:   D:\software_download\android-ndk-r10;

2. 在AS中配置关联NDK

  • local.properties中添加配置
ndk.dir=D\:\\software_download\\android-ndk-r10
  • Project工程目录下gradle.properties文件中添加配置
android.useDeprecatedNdk=true

3. 编写native方法

在AS中新建一个Project,然后再新建一个class为JNIS,在内部声明native方法

public class JNIS {

    	public native String helloJNI();
    
}

4. 定义对应的JNI

  • 在main下创建jni文件夹

  • 生成native方法对应的JNI函数声明头文件

在cmd命令窗口中,切换目录到java目录下(D:\as_workspace\Project\testjni\src\main\java),运行命令 :

javah com.hx.testjni.JNIS

会生成com_hx_testjni_JNIS.h的头文件,内容为

#include <jni.h>
/* Header for class com_hx_testjni_JNIS */

#ifndef _Included_com_hx_testjni_JNIS
#define _Included_com_hx_testjni_JNIS
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_hx_testjni_JNIS
 * Method:    helloJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hx_testjni_JNIS_helloJNI
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
  • 将生成的头文件转移到jni文件夹下

  • 在jni下定义对应的函数文件: test.c 内容如下:

#include "com_hx_testjni_JNIS.h"  //引用生成头文件

JNIEXPORT jstring JNICALL  Java_com_hx_testjni_JNIS_helloJNI  
        (JNIEnv * env, jobject jobj) {    

    return (*env)->NewStringUTF(env, "Hello from C");
    
}
  • 在jni文件夹下创建一个空的C文件: empty.c

说明: 这是AS的bug, 必须至少2个C文件才能通过编译

5. 指定编译的不同CPU

在testjni Module目录下build.gradle文件中配置

android {
       ...

    defaultConfig {

        ...

        ndk{
            moduleName "HelloJni" //so文件: lib+moduleName+.so
            abiFilters "armeabi", "armeabi-v7a", "x86" //cpu的类型
        }

    }
}

6. 编译生成不同平台下的动态链接文件

点击AS工具栏中的Build-->Rebuild Project,生成 .so文件 (so文件目录: build\intermediates\ndk\debug\lib\ndk\debug\lib...)

7. 调用native方法

  • 在native方法所在的类(JNIS类中)中加载so文件
public class JNIS {

        static {

        	System.loadLibrary("HelloJni");  //加载.so文件
        
    	      }

    	public native String helloJNI();
    
}
  • 在Activity中调用native方法:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String result = new JNIS().helloJNI();

        Log.e("TAG", "result=" + result);
        Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
    }
}

下面为项目的目录结构图:

输入图片说明

© 著作权归作者所有

共有 人打赏支持
蜗牛崛起
粉丝 3
博文 120
码字总数 63547
作品 0
东城
程序员
Android JNI学习(二)——实战JNI之“hello world”

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

Android Studio 3.2新功能特性

android studio3.2预览版本已经发布了,下面这些功能在最新的版本已经提供,但可能尚未在测试版本中发布渠道中提供。 什么是新的助理 Android Studio 3.2有一个新的Assistant面板,可以通知您...

我就是马云飞 ⋅ 06/14 ⋅ 0

用Android Studio进行NDK编程入门实例

参考了网上各种教程,跌跌撞撞最终才把流程走通,特此记录一下: 有必要先交代下开发环境: 操作系统:Win7 Android Studio 3.0.1 gradle 3.0.1 首先,新建一个Android项目,然后在MainActiv...

analogous_love ⋅ 04/17 ⋅ 0

Android NDK开发的一点尝试

写在前面 笔者是一个“原始”的C++开发者,对Java编程虽说不上抵触但也没有C++那么顺手。而且,作为一个游戏引擎,不管是在什么地方,效率总是第一位的,尤其是在移动平台这样资源吃紧的环境...

闪电的蓝熊猫 ⋅ 04/06 ⋅ 0

Android P 应用兼容常见错误及建议

从 2018 年 3 月初我们发布 Android P 开发者预览版以来,很多开发者都对当前常见应用在 Android P 上做了一些兼容性测试,我们在这里总结了一些常见的问题,以及它们发生的原因和建议的修改...

谷歌开发者 ⋅ 04/25 ⋅ 0

Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

Android Studio 3.2 Canary 发布,新增大量实用功能

在今天的 Google 2018 I/O 大会上,释出了 Android Studio 3.2 的最新预览版,并带来了一系列的新功能,如支持 Android P 开发预览版、新的 Android App Bundle,以及 Android Jetpack。官方...

局长 ⋅ 05/09 ⋅ 0

Android JNI学习(五)——Demo演示

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

在 Ubuntu 和 Linux Mint 中轻松安装 Android Studio

Android Studio 是谷歌自己的 Android 开发 IDE,是带 ADT 插件的 Eclipse 的不错替代品。Android Studio 可以通过源代码安装,但在这篇文章中,我们将看到如何在 Ubuntu 18.04、16.04 和相应...

作者: Abhishek Prakash ⋅ 05/10 ⋅ 0

Echoprint系列--Android编译与调用

在Echoprint系列--编译中编译了源码,这次将Echoprint移植到Android平台并测试识别歌曲功能。 一、编译库 1、环境准备 Android NDK,我的是android-ndk-r10e 修改源码,把src中的.cxx的文件重...

jwzhangjie ⋅ 2015/06/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

005. 深入JVM学习—Java堆内存参数调整

1. JVM整体内存调整图解(调优关键) 实际上每一块子内存区域都会存在一部分可变伸缩区域,其基本流程:如果内存空间不足,则在可变的范围之内扩大内存空间,当一段时间之后,内存空间不紧张...

影狼 ⋅ 23分钟前 ⋅ 0

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 56分钟前 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

mysql的分区和分表

1,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一...

梦梦阁 ⋅ 今天 ⋅ 0

exception.ZuulException: Forwarding error

错误日志 com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: xxx timed-out and no fallback available. Ca......

jack_peng ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部