android之NDK环境小试牛刀
2016-02-26 16:22
543 查看
环境: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 方法
在上面按alt+enter生成c层的方法
会自动生成 .c 文件
接着修改 Module的 build.gradle 文件,新增(注意name和你static里写的要一致)
完整的build.gradle 文件
主要的代码都是在 xx.c的文件里书写的,我们修改 该文件,上面写的是void,想在手机端显示,所以改为String 类型的
如果需要生成.h 的文件,可以在Terminal 里执行命令行
由于 NDK 主要是在linux里使用的,在window 环境下有一些bug,所以要在jni 目录下新建一个 util.c 的空白文件
接着就是在avtivity里调用了,
没有几行代码,我就不上传源码了
以前也搞过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 JNICALL Java_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/java D:\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(); }运行结果:
没有几行代码,我就不上传源码了
相关文章推荐
- Android 报错问题总结(持续更新中)
- 转---FindViewById的替代
- android studio gradle 多渠道打包之完全详解(打包系列教程之四)
- android 使用代码实现 RelativeLayout布局 addRule方法
- 转android开发基础1Andriod界面设计适配和Android Studio中的资源
- 培训的真的都这么牛逼么?
- android一个比较奇葩的bug(不知道是不是bug,很奇葩)
- 内存管理
- Android Support兼容包详解
- Android逆向分析基础-Android可执行文件
- Android启动过程分析——init.c(一)
- Android学习之适配器BaseAdapter
- Android开发实战总结(持续更新中)
- Android 利用xUtils框架实现对sqllite的增删改查
- android studio打apk包
- android里面有多个activity如何设置一个为主界面上的activity
- Android SDK Tools功能
- Android(二)遇到的小问题
- 4.8.4 如何去掉Android 应用的actionbar
- 《Android源码设计模式解析与实战》——原型模式