虽然具体还没有需要用到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++的觉悟。。