文档章节

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

蜗牛崛起
 蜗牛崛起
发布于 2016/07/27 16:29
字数 497
阅读 41
收藏 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编程入门笔记

为何要用到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 最新 NDK r8 在window下开发环境搭建

android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) 一直想搞NDK开发却一直给其他事情耽搁了,参考了些网上的资料今天终于把环境搭建起来...

lxp198837
2014/04/23
0
0
Windows环境下 android-ndk-r10c 环境搭建

1 下载NDK 地址: http://developer.android.com/tools/sdk/ndk/index.html 2 下载后双击自动解压到当前目录,建议与android sdk平级 D:androidandroid-ndk-r10c 3 添加环境变量 ndk=D:androi...

筱龙缘
2014/10/21
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0
jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
今天
0
0
java大数据转换16进制转10进制

public static void main(String[] args) {String hex = "0xdbf3accc683297cf0000";BigInteger amount = new BigInteger(hex.substring(2), 16);System.out.println(amount);......

任梁荣
昨天
2
0
OSChina 周六乱弹 —— 目测我们程序员丁克的几率不大

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @真Skr小机灵鬼儿:8.13分享Jocelyn Pook/Russian Red的单曲《Loving Strangers》 《Loving Strangers》- Jocelyn Pook/Russian Red 手机党少...

小小编辑
昨天
13
3
TypeScript基础入门 - 函数 - 剩余参数

转载 TypeScript基础入门 - 函数 - 剩余参数 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.1 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部