环境:android studio,jdk1.8

以前也搞过NDK,我以为我记录了,现在再要使用时,突然发现自己当初没有记录下来,好的吧,自己被自己给坑了。。。

网友们以及官方给的创建NDK的方式,其实很好,但是我个人感觉很麻烦,发现一个最简单的配置NDK环境的方式

首先你要有NDK ,最新的版本r10e:http://developer.android.com/ndk/downloads/index.html运行会自己解压到当前目录

NDK配置英文:http://tools.android.com/tech-docs/new-build-system/gradle-experimental#TOC-Introduction(要是Android studio还没有安装,我就没办法了,先百度安装好吧,如果需要翻_墙下载,各位使用pac主站,或者使用日本和台湾的)。

接着打开Android studio,file->Project Structure,切到的SDK Location页进行安装

或者使用Android Studio内置的SDK管理器下载NDK,注意这个NDK安装好后其目录在SDK目录下的 ndk-bundle 目录下,SDK是你安装时选择的路径,比如我的: D:\Users\chenling\AppData\Local\Android\sdk\ndk-bundle


下面的就不需要你管了,编辑器会自己下载安装。

接着就要配置NDK 项目了,首先新建一个测试项目,新建完成后找到gradle.properties 文件,在里面(里面全部都是注释)新增:android.useDeprecatedNdk=true

不用犹豫,不用徘徊,是的,你已经配合DNK的环境了,不需要网友和官方的那些步骤啦。

然后在 main 里新建一个jni文件夹


就在生成的MainActivity里,声明 native 方法

<span style="white-space:pre"></span>/*NDK*/    static {        System.loadLibrary("FFmpegtest");    }    public native void FFmpegtest();
会发现 FFmpegTest 是红色的

在上面按alt+enter生成c层的方法
会自动生成 .c 文件

接着修改 Module的build.gradle 文件,新增(注意name和你static里写的要一致)

 <span style="white-space:pre"></span>ndk {            moduleName "FFmpegtest"            ldLibs "log"//实现__android_log_print            abiFilters "armeabi", "armeabi-v7a", "x86"        }

完整的build.gradle 文件

主要的代码都是在 xx.c的文件里书写的,我们修改 该文件,上面写的是void,想在手机端显示,所以改为String 类型的

#include <jni.h>#include "android/log.h"JNIEXPORT jstring JNICALLJava_youku_cl_com_ffmpeg01_MainActivity_FFmpegtest(JNIEnv *env, jobject instance) {    // 日志输出    __android_log_write(ANDROID_LOG_ERROR,"TAG","This is a Test...");    //返回 activity    return (*env)->NewStringUTF(env,"I'm comes from to Native Function!");}

如果需要生成.h 的文件,可以在Terminal 里执行命令行

D:\Users\chenling\AndroidStudioProjects\YouKuTest001>cd ffmpeg01/src/main/javaD:\Users\chenling\AndroidStudioProjects\YouKuTest001\ffmpeg01\src\main\java>javah -d ../jni youku.cl.com.ffmpeg01.MainActivity
就可以生成 .h 文件
由于 NDK 主要是在linux里使用的,在window 环境下有一些bug,所以要在jni 目录下新建一个 util.c 的空白文件


接着就是在avtivity里调用了,

<span style="white-space:pre"></span> tv=(TextView)findViewById(R.id.tv);        tv.setText(FFmpegtest());
完整activity代码,基本都是自动生成的,我懒得修改删除了

package youku.cl.com.ffmpeg01;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.View;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;public class MainActivity extends AppCompatActivity {    private TextView tv=null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)                        .setAction("Action", null).show();            }        });        tv=(TextView)findViewById(R.id.tv);        tv.setText(FFmpegtest());    }    @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);    }    /*NDK*/    static {        System.loadLibrary("FFmpegtest");    }    public native String FFmpegtest();}
运行结果:

没有几行代码,我就不上传源码了





更多相关文章

  1. Android(安卓)Intent的几种用法全面总结
  2. Android(安卓)完美退出 App 方法
  3. Android(安卓)创建桌面快捷方式
  4. android sdk2.0分辨率的bug
  5. android 中设置http请求头headers的Cookie
  6. Cocos2d-x 3.0 编译出错 解决 error: expected ';' at end of me
  7. android优化实战(一)-从递归到迭代
  8. Android(安卓)Kotlin的使用及简单实例
  9. system 权限程序不能访问sd卡问题

随机推荐

  1. android刮刮卡效果
  2. android-App Widget Host
  3. Managing Bitmap Memory
  4. android 进度条学习
  5. android 来电去电监听
  6. Android曲线图,柱状图,饼图
  7. Android(安卓)5.0设置全屏无标题
  8. Html.fromHtml deprecated in Android(安
  9. java.lang.NullPointerException
  10. Android(安卓)instrumentation原理