借助C/C++进行Android开发:NDK的配置与使用

来源:互联网 发布:淘宝地区编码在哪填写 编辑:程序博客网 时间:2024/05/17 03:36

Android Studio版本 :1.3.2

NDK版本:android-ndk-r10b


1.下载NDK,选用android-ndk-r10b版本

2. 配置环境变量(像当初配java一样配置)

计算机-右键-属性-高级系统设置-环境变量-系统变量-Path一项—双击

将下载的NDK R10d版本的路径添加到变量值后面(记得加分号,路径名不要有空格)

;D:\code\android-ndk-r10d


3.cmd-输入 ndk-build,显示:



在cmd中输入ndk-build,显示以上内容,说明ndk-build命令可以查找到,但是原则伤讲ndk应该是在一个Android项目中的,所以抛出这样的异常,但是这说明环境已经配好了。



4.打开Android Studio,像正常新建项目一样新建一个Android 项目


5.在MainActivity里写上:

public native String getStringFromNative(); 

即在该类里面定义一个native方法。

附MainActivity.java里的全部代码:

package com.example.pc.ndktest6;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends Activity {    public native String getStringFromNative();    private TextView tv=null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv= (TextView) findViewById(R.id.tv);        tv.setText(" "+getStringFromNative());    }    static {        System.loadLibrary("MyJni");    }}


为什么要把名字命名为ndktest6呢?

因为我做到第6个测试demo的时候才运行成功,不要问我之前经历了什么微笑


6.Build-Make Project 一下。


7.休息一下



8.在Terminal下输入命令行  cd app/src/main

回车,进入到app/src/main


9.在app/src/main下输入命令行:

javah -d jni -classpath C:/Users/pc/AppData/Local/Android/sdk/platforms/android-23/android.jar;../../build/intermediates/classes/debug com.example.pc.ndktest6.MainActivity


其中
C:/Users/pc/AppData/Local/Android/sdk/platforms/android-23/android.jar;
为Android SDK位置


如果报错无法找到文件MainActivity或者android.app.Activity就多Build-Make Project 几次或者 Clean Project一下


10.

此时,app文件夹下会自动生成一个jni文件夹,文件夹下会包含一个名为

com_example_pc_ndktest6_MainActivity.h

的文件。

文件都建好之后的样子:



11.在jni文件夹下新建两个C文件。

上图是我建完C文件后的样子。

为什么要建两个?

因为有一个是我们测试要用的,但是据说如果只建一个的话会报奇怪的错误,这个错误我也遇到了,解决方法就是再新建一个C文件。

上图中main.c就是要用的,nothing.c就是为了防止报错辅助用的。


12.在main.c里面填上一些测试代码:

#include "main.h"#include "com_example_pc_ndktest6_MainActivity.h"/* * Class:     com_example_pc_ndktest6_MainActivity * Method:    getStringFromNative * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_pc_ndktest6_MainActivity_getStringFromNative        (JNIEnv * env, jobject obj){    return (*env)->NewStringUTF(env,"***I come from main.c***");}


13.在gradle.properties的最后面添上一句:

android.useDeprecatedNdk=true
表示允许使用NDK


14.在local.properties的最后面加上:

sdk.dir=C\:\\Users\\pc\\AppData\\Local\\Android\\sdkndk.dir=D\:\\code\\android-ndk-r10b


sdk.dir那句应该是本来就有的,就加上后面ndk的就行了


15.在app的build.gradle文件下的defaultConfig中加上:

 ndk{            moduleName "MyJni"  //设置库(so)文件名称        }


16.

在activity中增加对so的加载:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. static {  
  2.     System.loadLibrary("MyJni");  
  3. }  

上面贴出来的MainActivity代码是加完这句之后的完整代码


17.完成


0 0