您的位置:首页 > 编程语言 > C语言/C++

NDK环境搭建和JNI示例详解

2017-07-21 10:02 656 查看
一、概述

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.运行

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java api jni c语言