安卓 Android Studio NDK 神坑总结
开发环境window-64 和Android Studio 2.2.3
(希望能帮到和我一样刚开始学android的人吧)
- 安装Studio NDK
- 写NDK代码
1. 安装NDK
.前提 安装好JDK
Android Studio 自行找地址下载 最好下载最新版本的 我下载版本2.2.3
安装ndk 打开sdk Manager
勾选NDK
安装的时间可能有点长 安装完成后界面如下
2 创建项目
1.通过Android Studio Wizard 创建一个普通的项目
- 定义有一个native 方法,MainActivity内容如下:
native方法在后面 用c或c++实现
package com.example.myapplication;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public native String HelloJNI();
}
2.编译生成头文件
编写完MainActivity后需要rebulid 项目一下 app目录下产生class
这里生成头文件时特头疼出现了好多错误
打开studio自带的控制窗口
首先切换到 工程的main目录下
cd app\src\main
执行javah -d jni -classpath E:\ProgramFiles\AndroidStudio\SDK\platforms\android-19\android.jar; ..\..\build\intermediates\classes\debug com.xu.jni.MainActivity
这里
-d jni指明要在当前目录下创建jni文件夹存储生成的头文件;
-classpath …\android.jar,由于这里编译的MainActivity中使用了Android 的api,所以要将android.jar加入编译路径(这里使用的是buildSdkVersion对应的android.jar);
第二个classpath 为产生MainActivity.class的目录
要生成头文件的MainActivity的完全限定名 (com. example. myapplication.MainActivity)前要留有空格.
这里我也不太清楚 难道每次都要写这么多? 我试过别的写法 或多或少 没这样写结构看着舒服,这样写完 会在java文件的下面出现一个jni的文件夹 里面有头文件。
3.编写c文件
右键jni文件夹 new C/C++ source file
名字可以随便取 只要包含头文件的名字就好
#include "com_xu_jnilast_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_xu_jnilast_MainActivity_HelloJNI
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"Hello I'm from JNI");
}
3.配置文件
这里不需要Android.mk文件,studio可以自己生成,但需要配置一些其他的文件
在app下面有一个build.gradle文件,在defaultconfig中设置如下
defaultConfig {
applicationId "com.xu.jnilast"
minSdkVersion 14
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk{
moduleName "HelloJNI"
abiFilters "armeabi","armeabi-v7a"
}
}
添加ndk 这里的名字在调用时还得用 ,第二个是编译出哪些平台的动态链接库
在gradle.properties中添加
android.useDeprecatedNdk=true
准备工作做好后修改MainActivity.java 进行调用
package com.xu.jnilast;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
public native String HelloJNI();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
TextView textView=new TextView(this);
setContentView(textView);
textView.setText(HelloJNI());
}
static {
System.loadLibrary("HelloJNI");
}
}
注意名字别写错
这时候在编译一下 如果成功的话会自动编译出动态链接库 和mk文件
尝试下在虚拟机中运行