eclipse下第一个Android NDK应用

来源:互联网 发布:网络电视浏览器tv版 编辑:程序博客网 时间:2024/06/11 04:08

       也说不上原创吧。因为最近要做一个视频播放的功能,需要用到FFmpeg,但这个的引用又不像搞个jar包引用一下就完事这么方便。通过逐步的学习与了解,才发现这属于我从未开发过的NDK应用。所以搞不懂,也还算正常。因此这些天就开始了NDK开发的初步学习,这篇文章借鉴了很多前辈的博文,在此深表感谢。

        好了,开始正文。

         主要参考:

           ①http://www.cnblogs.com/pplxlee/p/5559223.html

           ②http://blog.csdn.net/w815878564/article/details/49645839

一、Android NDK开发环境

         NDK下载

         完成下载后,在eclipse中配置NDK的路径。Window→Preferences,若PreferencesAndroid 中未找到NDK选项,请参考链接。还有一种情况是无法选择你刚才下载好的NDK,这时在你安装的ndk的主目录下创建一个ndk-build空文件,然后重新打开对话框选择就可以了。参考:http://blog.csdn.net/mynameishuangshuai/article/details/51673695

。。。。


      


二、编写一个NDK的应用

    1.首先新建工程,取名为MyFirstJni,在工程的MainActivity中,编写代码如下:

import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = new TextView(this);tv.setText(getNum() + "");setContentView(tv);}private native int getNum(); // 声明Native方法getNumstatic {System.loadLibrary("MyFirstJni"); // 载入动态链接库libMyFirstJni.so}}

    

     2.然后右键工程,Android Tools->Add Native Support,进入后注意框里面的名字要和MainActivity的程序中加载的动态链接库的名字相同,这里输入"MyFirstJni"直接点完成即可。

  我们会看到产生了新的文件夹jni,并生成了文件MyFirstJni.cpp和Android.mk。MyFirstJni.cpp用于编写C++代码,去定义getNum()方法的具体实现过程,而Android.mk则描述了编译C++成库的方式。这时还缺少Application.mk,新建一个,文件内容为APP_ABI := all,这个文件使得编译器生成其支持的全平台的so文件,如果针对某一平台开发,可以具体设置。

     


     3. 接着是配置JAVAH工具,这个实际原理还是和网上说的命令行操作一样。这里只是将命令行操作改成了可视化操作,可以极大的提高效率。

 

    第一步,打开eclipse的外部工具配置,点击后选择External Tools Configurations… 

   


    第二步,添加一个工具: 



    第三步,配置Javah命令: 



命令为: 

  -v -classpath "${project_loc}/src"
  -d "${project_loc}/jni"
  -jni ${java_type_name}


完成上述操作后,选择应用。然后,在光标在MainActivity.java内的情况下,运行此工具。会看到在jni文件夹内生成了com_example_myfirstjni_MainActivity.h的文件。

  打开后可以看到代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_myfirstjni_MainActivity */#ifndef _Included_com_example_myfirstjni_MainActivity#define _Included_com_example_myfirstjni_MainActivity#ifdef __cplusplusextern "C" {#endif/* * Class:     com_example_myfirstjni_MainActivity * Method:    getNum * Signature: ()I */JNIEXPORT jint JNICALL Java_com_example_myfirstjni_MainActivity_getNum  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif

实际上就是声明了JNIEXPORT jint JNICALL Java_com_example_myfirstjni_MainActivity_getNum函数,对应与java代码中的getNum函数,剩下的事情就是编码实现getNum的功能了。

接下来编写MyFirstJni.cpp文件如下:

#include <jni.h>#include "com_example_myfirstjni_MainActivity.h"jint Java_com_example_myfirstjni_MainActivity_getNum    (JNIEnv *,jobject) {    return 5000;}

如果顺利的话运行一下,你就能在你的手机上看到5000了。但我并未成功,出现了如下报错:




最后感谢以下博主:

http://blog.csdn.net/songyuc/article/details/51339711

http://blog.csdn.net/zhubin215130/article/details/39347873

(PS:请先参考链接

解决了Unresolved inclusion: <jni.h>的错误提示

再次编译运行APP,看到5000,成功


最终项目结构如下:



原创粉丝点击