文档章节

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

蜗牛崛起
 蜗牛崛起
发布于 2016/07/27 16:29
字数 497
阅读 43
收藏 2

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
博文 127
码字总数 63547
作品 0
东城
程序员
私信 提问
Android: NDK编程入门笔记

为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C...

gongweixin
2013/04/23
0
3
Android NDK Hello

Android应用程序访问android的根文件系统中的文件时,由于应用程序的权限限制,无法访问这些文件,怎么办? 这时就要用到NDK编程了,既用C/C++代码实现访问系统文件,并将其生成本地库,供a...

长平狐
2013/01/06
130
0
Android: NDK编程入门笔记

为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C...

xubohui
2012/08/20
0
0
Android: NDK编程入门笔记

为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C...

JORDANSG
2012/08/14
0
0
Android JNI开发系列(四)通过C语言打印日志

Android Studio 通过C语言打印日志 引用Log.h 包 宏定义

蔡小鹏
10/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

缓存穿透,缓存雪崩的四种解决方案

前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑...

小致dad
24分钟前
2
0
PHP 文字生成透明图片之路

摘要:在现在的开发中会经常运用到生成图片的功能,常用的验证码生成等。PHP语言生成图片需要用到GD2功能模块,所以基本的图片,图形处理都是没什么压力滴。 准备: 1、打开GD2模块,在php.i...

昙花一现
25分钟前
0
0
impala系列: 基本命令和jdbc连接

--======================= 使用impala-shell 登录 --======================= impala-shell --auth_creds_ok_in_clear -l -i ip_address -u user_name --======================= JDBC dri......

hblt-j
26分钟前
1
0
CSS实例详解:Flex布局

本文由云+社区发表 本文将通过三个简单的实例,实际应用上篇文章的基础理论知识,展示下Flex布局是如何解决CSS布局问题。 一.垂直居中 这里同时用非flex布局和flex布局两种方式来实现,可以...

腾讯云加社区
32分钟前
6
0
安装全局webpack

https://www.jianshu.com/p/119a825d8bba npm ls webpack 和npm ls webpack -g 查看本地和全局版本 npm install webpack@1.15.0 -g 全局 然后到项目里面 npm install npm init npm install w......

lsy999
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部