在Android Studio 上编写jni程序入门
1、下载NDK包,在谷歌官网(或者其他地方)下载NDK包,解压压缩包到你想存放的地方。
2、在Android Studio中添加NDK文件存放路径:
2.1 首先需要确认你的Android Studio是否安装了Android NDK Support插件,在File->Setting->Plugins,如图一
图1
2.2 右键需要加入NDK的module(Android Studio中每个project可以包含多个module),右键->Open Module Setting,见图2
图2
2.3 在Android NDK location设置NDK存放的路径
3 新建一个module,并定义一个class,如下代码
package zy.ustc.edu.cn.testjni;
/**
* Created by ustc-pc on 2015/9/20.
*/
public class NDKJniUtils {
public native String getString();
}
4 在gradle.properties文件中添加:
android.useDeprecatedNdk=true
5 打开Android Studio内置的Terminal(如果没有找到,按步骤一种检查是否安装Android NDK Support的方式,安装terminal),进入当前module,然后进入:build\intermediates\classes\debug 。(win10系统下,Android Studio内置terminal无法输入,需要在开始菜单中打开cmd,然后右键状态栏->默认值->使用旧版控制台(需要重启))
6 运行:javah -jni zy.ustc.edu.cn.testjni.NDKJniUtils 如图3所示。
图3
7 会在相应的目录下生成zy_ustc.edu.cn_testjni_NDKJniUtils.h文件。
8 在module下添加jni文件夹,然后将zy_ustc.edu.cn_testjni_NDKJniUtils.h文件剪切到jni文件夹下
9 在jni文件夹下创建一个.c/cpp文件,定义zy_ustc.edu.cn_testjni_NDKJniUtils.h文件中的方法getString(),如下代码
//
// Created by ustc-pc on 2015/9/14.
//
#include "zy_ustc_edu_cn_testjni_NDKJniUtils.h"
/*
* Class: zy_ustc_edu_cn_testjni_NDKJniUtils
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_zy_ustc_edu_cn_testjni_NDKJniUtils_getString
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK");
}
10 在module的build.gradle文件中的defaultConfig下,设置lib名,如图4所示
图4
11 在Java 类中加载lib,如下代码:
package zy.ustc.edu.cn.testjni;
/**
* Created by ustc-pc on 2015/9/20.
*/
public class NDKJniUtils {
static{
System.loadLibrary("testNDK");
}
public native String getString();
}
12 最后就是调用了:
package zy.ustc.edu.cn.testjni;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView mTV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTV = (TextView)findViewById(R.id.textView);
NDKJniUtils jni = new NDKJniUtils();
mTV.setText(jni.getString());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}