您的位置:首页 > 移动开发 > Android开发

AndroidStudio下初涉NDK开发

2016-04-05 22:13 447 查看
虽然具体还没有需要用到NDK开发,但先了解一下也是好的,所以搭建了一下NDK环境并配置尝试第一个helloworld,在网上找了很多文章,都略微有点不清楚,在此整理总结一下在AndroidStudio开发JNI过程。

一、下载NDK,配置环境变量

看了个网上视频教程是在eclipse下,需要用NDK的命令行,发现在AndroidStudio下不用,方便极了。。NDK翻墙到官网下,或者百度,这里下也行http://www.androiddevtools.cn/,下载解压即可。java命令还是要用的,所以需要配置系统环境变量,在Path一项加上jdk的路径,搞定。这里需要用的是javah命令。





二、新建android项目,配置gradle

1.在local.properties文件中添加NDK路径




这里的路径需要加多一个右斜杠
\

2.在gradle.properties文件中加一个“android.useDeprecatedNdk=true"





3.在app模块下新建JNI目录,当然在其他模块也行,将头文件跟源文件放到其他模块,然后调用也是可以的。





文件目录结构如此

4.在java文件中声明native函数,并加载库,这里就是app这个模块拉,导入其他模块也是可以的。步骤到这里声明的native函数底下是有红线警告的。



5.利用javah命令生成声明了native函数的类对应的头文件,命令: javah -d jni(输出的目录) -classpath E:\studytools\AndroidStudioProjects\NdkDemo\app\src\main\java(类的路径) -jni jali.w3cboss.ndkdemo.MainActivity(类)。在AS的Terminal或者window的cmd都ok。 执行完成后在jni目录下就生成头文件了。

6.编写C++文件,实现声明的native函数。这里我创建了个main文件





生成的头文件代码,包含两个未实现的函数:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jali_w3cboss_ndkdemo_MainActivity */

#ifndef _Included_jali_w3cboss_ndkdemo_MainActivity
#define _Included_jali_w3cboss_ndkdemo_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     jali_w3cboss_ndkdemo_MainActivity
* Method:    getJniHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jali_w3cboss_ndkdemo_MainActivity_getJniHello
(JNIEnv *, jobject);

/*
* Class:     jali_w3cboss_ndkdemo_MainActivity
* Method:    getAnotherHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jali_w3cboss_ndkdemo_MainActivity_getAnotherHello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

main.cpp:
//
// Created by Administrator on 2016/4/5.
//
#include <jali_w3cboss_ndkdemo_MainActivity.h>

JNIEXPORT jstring JNICALL Java_jali_w3cboss_ndkdemo_MainActivity_getJniHello
(JNIEnv *env, jobject obj){
return env->NewStringUTF("i come from native function!");
};
JNIEXPORT jstring JNICALL Java_jali_w3cboss_ndkdemo_MainActivity_getAnotherHello
(JNIEnv *env, jobject obj){
return env->NewStringUTF("i come from another native function!");
}
include以上头文件,分别实现两个函数

7. 还要在app模块的build.gradle配置文件中加上以下: moduleName的值是保存头文件和源文件的模块,可以是app也可以是导入的模块。



Activity代码:
package jali.w3cboss.ndkdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private native String getJniHello();
private native String getAnotherHello();

static {
System.loadLibrary("app");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv1 = (TextView) findViewById(R.id.tv1);
tv1.setText(getJniHello());
TextView tv2 = (TextView) findViewById(R.id.tv2);
tv2.setText(getAnotherHello());

}
}



运行程序,native函数成功调用拉~大功告成。
暂时没有用到这块知识,就先研究到这了,深入的以后再说。 要做大牛还是得有学好C++的觉悟。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: