AndroidStudio下初涉NDK开发

来源:互联网 发布:java 高仿京东商城 编辑:程序博客网 时间:2024/06/05 06:22

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

0 0
原创粉丝点击