1. 1Android NDK简介
  2.  
  3. NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持Java语言开发)。
  4.  
  5. 简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用。NDK开发的可以称之为底层开发或者jnijava native interface)层开发,SDK开发可以称为上层开发。
  6.  
  7. 2、为何要用NDK
  8.  
  9. 2.1、众所周知,利用SDK编写的代码,生成的APK,很容易就可以反编译了,安全性极为不高,而利用NDK开发的库,不容易被反编译,保密性,安全性都提高了。
  10.  
  11. 2.2、很多开源工程和大型工程都是C&C++代码,把它们转换为纯java语言显然是不可能的。
  12.  
  13. 2.3C&C++的代码运行速度和效率都比java快很多。
  14.  
  15. 3NDK环境的搭建
  16.  
  17. http://developer.android.com/sdk/ndk/index.html下载最新版的NDK,然后解压到你喜欢的位置,然后把NDK的所在的目录,配置到环境变量里面就行。
  18.  
  19. 如我在windows下面用cygwin开发。配置环境变量可以参考http://blog.csdn.net/conowen/article/details/7518870
  20.  
  21. 简单来说就是在Linux或者cygwin的安装目录,跳转到/home/YourName/,然后编辑.bash_profile文件,在末尾添加如下语句,具体根据自己的情况而定。
  22. [java] view plain copy
  23. print?在CODE上查看代码片派生到我的代码片
  24.  
  25. ndk=/home/conowen/android-ndk-r7b
  26.  
  27. export ndk
  28.  
  29. 4、新建一个NDK工程
  30.  
  31. 新建一个目录,命名为HelloWorld,然后在里面新建一个名为jni的目录(名称一定要是jni,因为ndk-build的时候会在HelloWorld目录下寻找jni的目录,然后进行build),在jni目录下新建如下文件HelloWorld.cAndroid.mk
  32.  
  33. HelloWorld.c文件代码如下(此JNI是没有jni_onLoad函数的)
  34. [java] view plain copy
  35. print?在CODE上查看代码片派生到我的代码片
  36.  
  37. #include <string.h>
  38. #include <jni.h>
  39.  
  40. jstring
  41. Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env,
  42. jobject thiz )
  43. {
  44. return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");
  45. }
  46.  
  47. /*注意,这里
  48.  
  49. jstring 表示返回值
  50.  
  51. Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI
  52.  
  53. 写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。
  54. 包名:com_conowen_helloworld
  55. Activity名:HelloWorldActivity
  56. 方法名:helloWorldFromJNI
  57.  
  58. JNIEnv* env, jobject thiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个helloWorldFromJNI是没有形参的。
  59. */
  60.  
  61. Android.mk代码如下
  62.  
  63. 关于Android.mk的编写格式,下一篇博文补全
  64. [java] view plain copy
  65. print?在CODE上查看代码片派生到我的代码片
  66.  
  67. LOCAL_PATH := $(call my-dir)
  68.  
  69. include $(CLEAR_VARS)
  70. #LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写
  71. LOCAL_MODULE := HelloWorld
  72. LOCAL_SRC_FILES := HelloWorld.c
  73.  
  74. include $(BUILD_SHARED_LIBRARY)
  75.  
  76. 然后在终端里面,转到HelloWorld目录下,执行
  77. [java] view plain copy
  78. print?在CODE上查看代码片派生到我的代码片
  79.  
  80. $ndk/ndk-build
  81.  
  82. $ndk是之前配置的NDK环境变量。编译成功后,会在在目录生成libsobj两个文件夹,libs里面有刚刚编译成的libHelloWorld.so库。
  83.  
  84. 5、新建一个Android工程
  85.  
  86. eclipse里面新建一个Android工程,java代码如下,然后把刚刚生成的libs文件夹拖到Android工程目录下。
  87. [java] view plain copy
  88. print?在CODE上查看代码片派生到我的代码片
  89.  
  90. package com.conowen.helloworld;
  91.  
  92. import android.app.Activity;
  93. import android.os.Bundle;
  94. import android.widget.TextView;
  95.  
  96. public class HelloWorldActivity extends Activity {
  97. /** Called when the activity is first created. */
  98. @Override
  99. public void onCreate(Bundle savedInstanceState) {
  100. super.onCreate(savedInstanceState);
  101.  
  102. TextView tv = new TextView(this);
  103. tv.setText(helloWorldFromJNI());
  104. setContentView(tv);
  105. }
  106.  
  107. public native String helloWorldFromJNI();// native声明,表示这个方法来自Native层。实现过程已经在native层实现了
  108.  
  109. static {
  110. System.loadLibrary("HelloWorld");// 加载库,前面的lib和,后缀名不用写
  111. }
  112. }

Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld的更多相关文章

  1. iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)

    iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController // ...

  2. Windows Phone开发(21):做一个简单的绘图板

    原文:Windows Phone开发(21):做一个简单的绘图板 其实我们今天要说的就是一个控件--InkPresenter,这个控件并不是十分强大,没办法和WPF中的InkCanvas相比,估计在实 ...

  3. Android Studio 蓝牙开发实例——基于Android 6.0

    因项目需要做一个Android 的蓝牙app来通过手机蓝牙传输数据以及控制飞行器,在此,我对这段时间里写的蓝牙app的代码进行知识梳理和出现错误的总结. 该应用的Compile Sdk Version ...

  4. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  5. 利用HttpClient写的一个简单页面获取

    之前就听说过利用网络爬虫来获取页面,感觉还挺有意思的,要是能进行一下偏好搜索岂不是可以满足一下窥探欲. 后来从一本书上看到用HttpClient来爬取页面,虽然也有源码,但是也没说用的HttpClie ...

  6. 【VS开发】 自己编写一个简单的ActiveX控件——详尽教程

    最近开始学ActiveX控件编程,上手不太容易,上网想找相关教程也没合适的,最后还是在师哥的指导下完成了第一个简单控件的开发,现在把开发过程贴出来与大家分享一下~ (环境说明--平台:vs2005:语 ...

  7. 【阿菜做实践】利用go语言写一个简单的Pow样例

    本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...

  8. OS开发UI篇—使用UItableview完成一个简单的QQ好友列表

    本文转自:http://www.cnblogs.com/wendingding/p/3763330.html 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableVi ...

  9. iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(二)

    一.实现效果             二.实现代码 1.数据模型部分 YYQQGroupModel.h文件 // // YYQQGroupModel.h // 02-QQ好友列表(基本数据的加载) / ...

随机推荐

  1. kafka同步生产者和异步生产者深入剖析

    什么是kafka同步生产者,什么是kafka异步生产者? 比如这里某个topic有3个分区. kafka同步生产者:这个生产者写一条消息的时候,它就立马发送到某个分区去.  kafka异步生产者:这个 ...

  2. menuconfig_kconfig

    这一节的主要内容: Menuconfig的操作 Kconfig和.config文件 Linux内核配置裁剪实验 linux编译器通过.config文件确认哪些代码编译进内核,哪些被裁减掉 menuco ...

  3. Flask项目之手机端租房网站的实战开发(七)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  4. apache+nginx 实现动静分离

    apache+nginx 实现动静分离 http://blog.csdn.net/xysoul/article/details/50347971

  5. Android Material风格的应用(二)--RecyclerView

    添加RecyclerView Android Material风格的应用(一)--AppBar TabLayoutAndroid Material风格的应用(二)--RecyclerViewAndro ...

  6. oled屏幕模块

    oled屏幕模块似乎是厂家提供的 也许可以根据屏幕驱动芯片去写 根据现在了解的芯片一般有两个:SH1106和SSD1306 不过这次我们用的是SSD1306芯片驱动的屏幕 下面是从裸屏到模块的pcb: ...

  7. 芯片AMS1117 电源芯片

  8. XAMPP简介

    XAMPP是一款开源.免费的网络服务器软件,经过简单安装后,就可以在个人电脑上搭建服务器环境.本文为大家介绍Windows中安装XAMPP(Apache+Mysql+PHP)及使用方法及其相关问题的总 ...

  9. Android 最火的高速开发框架AndroidAnnotations使用具体解释

    Android 最火的高速开发框架androidannotations配置具体解释文章中有eclipse配置步骤.Android 最火高速开发框架AndroidAnnotations简介文章中的简介. ...

  10. 部分城市关于.Net招聘数量

    2016-12-09更新统计数据 上海 10730 北京 6322 广州 4157 深圳 3548 成都 2291 重庆 706 厦门 285 2015-01-30日,前程无忧搜索".Net ...