教你学会Android的NDK开发

一.NDK是什么

  NDK是Native Development kit的缩写,即本地开发工具包,它支持用C/C++方式来开发Android,而SDK是用Java来开发Android。这样在安卓平台上就实现了Java+C/C++的开发方式。两者可以通过JNI (Java Native Interface)来互相调用。关于它们的关系如下图所示:

    

二.NDK的作用

     1.便于程序的移植,实现跨平台

     2.提高程序的性能,像一些特定模块,比如图像处理,音视频开发等

     3.防止核心代码被反编译,     

 三.编写一个NDK的例子

      1.下载Android NDK

      下载地址: 点击打开链接(需要翻墙),也可以去百度上搜一下

       下载下来如图:   我的是NDK8

           

如果你用的是NDK7之前的版本,那么你还需要去下载cygwin软件,它模拟了Linux环境,下载地址:点击打开链接, 具体的环境配置我就不过多介绍了.

当然已经没必要去这样弄了,NDK7之后的版本已经集成了Linux编译环境,操作简单的多. 

      2. 在eclipse中集成C/C++开发环境 ADT 

      (1).下载ADT,链接: http://www.eclipse.org/cdt/downloads.php  ,找到自己eclipse对应的版本,可以在eclipse中的.eclipseproduct文件中看到版本信息

      如图:

                    

  在下载页面有对应的ADT版本,是与版本名称对应的,如图

              

         我的4.2,对应Juno,则在下载页面对应Juno

           


  (2)复制这个链接,打开eclipse上的help菜单,选择Install New Software选项,弹出一个窗口

      (3)点击Add,把复制的链接粘贴进去,出现插件列表后点击Selec tAll,  然后next下一部,就可以等待安装完成了

      

3.Eclipse关联ndk-build

        这样不用我们打开ndk-build命令去手动编译了,eclipse自动编译,多省事大笑

      (1).Project->Properties->Builders->New,新建一个Builder

     

     (2).输入name, Location输入ndk-build的路径,Working Directory输入自己项目路径

     

(3)点击Refresh选项

        

      (4).点击Build Options选项

). 

  (5).点击Specify Resources

  

    4.新建一个android工程,在MainActivity里输入如下代码

public class MainActivity extends Activity {
 	// 1.定义一个本地方法
	public native String fromc();

	// 2.加载so文件
	static {
		System.loadLibrary("hello_jni");
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button button1 = (Button) findViewById(R.id.button1);

		button1.setOnClickListener(new OnClickListener() {
 		    @Override
			public void onClick(View v) {
				// 3.谈一个吐司,内容是从C++实现的
				Toast.makeText(MainActivity.this, fromc(), 0).show();
			}
		});

	}
}
这个hello_jni的so文件需要我们先编写C++代码,然后自动编译生成.我们新建一个jni目录,再新建一个hello.c文件.

            

   hello.c代码中,jstring表示返回字符串类型,这里方法名要注意,前面以Java开头,后面加上包名类名方法名,中间用下划线分割

     不要忘了加上string.h,jni.h等头文件

#include <string.h>
#include <jni.h>

//jstring 表示返回字符串
//传入env,obj参数
//调用NewStringUTF方法
//
jstring Java_com_example_ndkdemo_MainActivity_fromc(JNIEnv* env,jobject obj)
{

      return (*env)->NewStringUTF(env,"hello");

}

最后编写Android.mk文件, 放在jni目录下,mk文件及makefile文件,指定了编译的配置信息.       

LOCAL_PATH := $(call my-dir)    //LOCAL_PATH变量,用于查找源文件,固定的写法
include $(CLEAR_VARS)           //指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量,固定写法
LOCAL_MODULE    := hello_jni    //表示编译生成的名称
LOCAL_SRC_FILES := hello.c      //表示要编译的模块
include $(BUILD_SHARED_LIBRARY) //编译生成共享库
当你写好mk文件后,保存之后会发现源代码目录多了个obj目录,里面就有我们要的so文件.


     现在把你的程序运行起来就可以了。  

       Demo地址: 点击打开链接 密码:ms4v


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章