安卓 Android Studio NDK 神坑总结

安卓 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文件

这里写图片描述

尝试下在虚拟机中运行

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值