NDK环境搭建和JNI示例详解

一、概述
JNI是Java Native Interface的缩写,提供一些API实现了Java和C&C++语言的通信。以下示例开发用的工具是android stduio。

二、NDK环境配置
1.配置gradle.properties文件

android.useDeprecatedNdk=true

2.下载NDK文件配置local.properties文件。如果NDK已经下载,直接配置使用就可以
这里写图片描述

sdk.dir=/Users/Desktop/sdk/sdk
ndk.dir=/Users/Desktop/android-ndk-r11b

3.配置gradle
这里写图片描述

二、Jni示例
1、新建一个工程,创建JniUtils.class,在内部声明native方法。

public class JniUtils {

    public native String getCLassString();

    public native int getInt(int i,int y);
}

2、在MainActivity文件中调用声明JNI的方法。

public class MainActivity extends AppCompatActivity {
   private TextView mJinText;

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

    public void init(){
        mJinText = (TextView)findViewById(R.id.jni_tv);
        JniUtils ndkJniUtils = new JniUtils();
        mJinText.setText(ndkJniUtils.getCLassString());//ndkJniUtils.getInt(1,2)也可以调用此方法
    }
}

3、编译运行代码。得到.class文件。

JniDemo\app\build\intermediates\classes\debug  

4、生成.h文件

1.从命令行或android studio自带的Terminal进入项目目录debug根目录下。
>cd JniDemo\app\build\intermediates\classes\debug 
2.在debug目录下执行javah命令生成h文件
debug> javah -jni demo.jni.cn_jnidemo.JniUtils  

5、查看.h文件
1.执行完生成.h指令后,可以在JniDemo\app\build\intermediates\classes\debug 目录下看到该文件
这里写图片描述

.h文件内容

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class demo_jni_cn_jnidemo_JniUtils */

#ifndef _Included_demo_jni_cn_jnidemo_JniUtils
#define _Included_demo_jni_cn_jnidemo_JniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     demo_jni_cn_jnidemo_JniUtils
 * Method:    getClassString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_demo_jni_cn_jnidemo_JniUtils_getClassString
  (JNIEnv *, jobject);

/*
 * Class:     demo_jni_cn_jnidemo_JniUtils
 * Method:    getInt
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_demo_jni_cn_jnidemo_JniUtils_getInt
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

6.在app/src/main目录下创建jni文件夹。把.h文件拷贝进来。
这里写图片描述
7.在jni目录下新建jni.c文件。文件名称可以自定义。.c文件实现我们需要的方法
这里写图片描述
查看.c文件

#include "demo_jni_cn_jnidemo_JniUtils.h"


JNIEXPORT jstring JNICALL Java_demo_jni_cn_jnidemo_JniUtils_getClassString
  (JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"Android!");
}
JNIEXPORT jint JNICALL Java_demo_jni_cn_jnidemo_JniUtils_getInt
    (JNIEnv *env, jobject obj, jint x, jint y) {
    int res = x + y;
    return res;
}

8.在JniUtils中添加loadLibrary方法。

public class JniUtils {

    static {
            System.loadLibrary("JniLib");
    }

    public native String getClassString();

    public native int getInt(int i, int y);
}

9.运行
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值