zoukankan      html  css  js  c++  java
  • Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld

    原文: http://blog.csdn.net/conowen/article/details/7522667




    1、Android NDK简介

    NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发)。

    简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用。NDK开发的可以称之为底层开发或者jni(java  native interface)层开发,SDK开发可以称为上层开发。


    2、为何要用NDK


    2.1、众所周知,利用SDK编写的代码,生成的APK,很容易就可以反编译了,安全性极为不高,而利用NDK开发的库,不容易被反编译,保密性,安全性都提高了。

    2.2、很多开源工程和大型工程都是C&C++代码,把它们转换为纯java语言显然是不可能的。

    2.3、C&C++的代码运行速度和效率都比java快很多。


    3、NDK环境的搭建

    http://developer.android.com/sdk/ndk/index.html下载最新版的NDK,然后解压到你喜欢的位置,然后把NDK的所在的目录,配置到环境变量里面就行。

    如我在windows下面用cygwin开发。配置环境变量可以参考http://blog.csdn.net/conowen/article/details/7518870


    简单来说就是在linux或者cygwin的安装目录,跳转到/home/YourName/,然后编辑.bash_profile文件,在末尾添加如下语句,具体根据自己的情况而定。

    [java] view plaincopy
    1. ndk=/home/conowen/android-ndk-r7b  
    2.   
    3. export ndk  


    4、新建一个NDK工程

    新建一个目录,命名为HelloWorld,然后在里面新建一个名为jni的目录(名称一定要是jni,因为ndk-build的时候会在HelloWorld目录下寻找jni的目录,然后进行build),在jni目录下新建如下文件HelloWorld.c和Android.mk。

    HelloWorld.c文件代码如下(此JNI是没有jni_onLoad函数的)

    [java] view plaincopy
    1. #include <string.h>  
    2. #include <jni.h>  
    3.   
    4. jstring  
    5. Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env,  
    6.                                                   jobject thiz )  
    7. {  
    8.     return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");  
    9. }  
    10.   
    11.   
    12.   
    13.   
    14.  /*注意,这里 
    15.  
    16. jstring 表示返回值 
    17.  
    18. Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI 
    19.  
    20. 写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。 
    21. 包名:com_conowen_helloworld 
    22. Activity名:HelloWorldActivity 
    23. 方法名:helloWorldFromJNI 
    24.  
    25. JNIEnv* env, jobject thiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个helloWorldFromJNI是没有形参的。 
    26. */  

    Android.mk代码如下

    关于Android.mk的编写格式,下一篇博文补全

    [java] view plaincopy
    1. LOCAL_PATH := $(call my-dir)  
    2.   
    3. include $(CLEAR_VARS)  
    4. #LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写  
    5. LOCAL_MODULE    := HelloWorld  
    6. LOCAL_SRC_FILES := HelloWorld.c  
    7.   
    8. include $(BUILD_SHARED_LIBRARY)  

    然后在终端里面,转到HelloWorld目录下,执行

    [java] view plaincopy
    1. $ndk/ndk-build  
    $ndk是之前配置的NDK环境变量。编译成功后,会在在目录生成libs和obj两个文件夹,libs里面有刚刚编译成的libHelloWorld.so库。


    5、新建一个Android工程

    在eclipse里面新建一个Android工程,java代码如下,然后把刚刚生成的libs文件夹拖到Android工程目录下。

    [java] view plaincopy
    1. package com.conowen.helloworld;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5. import android.widget.TextView;  
    6.   
    7. public class HelloWorldActivity extends Activity {  
    8.     /** Called when the activity is first created. */  
    9.     @Override  
    10.     public void onCreate(Bundle savedInstanceState) {  
    11.         super.onCreate(savedInstanceState);  
    12.   
    13.         TextView tv = new TextView(this);  
    14.         tv.setText(helloWorldFromJNI());  
    15.         setContentView(tv);  
    16.     }  
    17.   
    18.     public native String helloWorldFromJNI();// native声明,表示这个方法来自Native层。实现过程已经在native层实现了  
    19.   
    20.     static {  
    21.         System.loadLibrary("HelloWorld");// 加载库,前面的lib和,后缀名不用写  
    22.     }  
    23. }  


    效果图:


  • 相关阅读:
    Asp.net 动态添加Meta标签
    【转】在SharePoint Server 2010中更改“我的网站”
    SPQuery DateTime 类型查询
    Asp.net Web Application 打开 SharePoint 2010 Site 错误 The Web application at could not be found
    How To Create SharePoint 2010 Site Collection In Its Own DB
    C# 文件打印
    面试题 java集合
    《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
    《深入理解Java虚拟机》(五)JVM调优
    《深入理解Java虚拟机》(四)虚拟机性能监控与故障处理工具
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207328.html
Copyright © 2011-2022 走看看