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

    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 plain copy
    print?在CODE上查看代码片派生到我的代码片
    
        ndk=/home/conowen/android-ndk-r7b  
          
        export ndk  
    
    
    4、新建一个NDK工程
    
    新建一个目录,命名为HelloWorld,然后在里面新建一个名为jni的目录(名称一定要是jni,因为ndk-build的时候会在HelloWorld目录下寻找jni的目录,然后进行build),在jni目录下新建如下文件HelloWorld.c和Android.mk。
    
    HelloWorld.c文件代码如下(此JNI是没有jni_onLoad函数的)
    [java] view plain copy
    print?在CODE上查看代码片派生到我的代码片
    
        #include <string.h>  
        #include <jni.h>  
          
        jstring  
        Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env,  
                                                          jobject thiz )  
        {  
            return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");  
        }  
          
          
          
          
         /*注意,这里 
         
        jstring 表示返回值 
         
        Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI 
         
        写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。 
        包名:com_conowen_helloworld 
        Activity名:HelloWorldActivity 
        方法名:helloWorldFromJNI 
         
        JNIEnv* env, jobject thiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个helloWorldFromJNI是没有形参的。 
        */  
    
    
    Android.mk代码如下
    
    关于Android.mk的编写格式,下一篇博文补全
    [java] view plain copy
    print?在CODE上查看代码片派生到我的代码片
    
        LOCAL_PATH := $(call my-dir)  
          
        include $(CLEAR_VARS)  
        #LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写  
        LOCAL_MODULE    := HelloWorld  
        LOCAL_SRC_FILES := HelloWorld.c  
          
        include $(BUILD_SHARED_LIBRARY)  
    
    然后在终端里面,转到HelloWorld目录下,执行
    [java] view plain copy
    print?在CODE上查看代码片派生到我的代码片
    
        $ndk/ndk-build  
    
    $ndk是之前配置的NDK环境变量。编译成功后,会在在目录生成libs和obj两个文件夹,libs里面有刚刚编译成的libHelloWorld.so库。
    
    
    5、新建一个Android工程
    
    在eclipse里面新建一个Android工程,java代码如下,然后把刚刚生成的libs文件夹拖到Android工程目录下。
    [java] view plain copy
    print?在CODE上查看代码片派生到我的代码片
    
        package com.conowen.helloworld;  
          
        import android.app.Activity;  
        import android.os.Bundle;  
        import android.widget.TextView;  
          
        public class HelloWorldActivity extends Activity {  
            /** Called when the activity is first created. */  
            @Override  
            public void onCreate(Bundle savedInstanceState) {  
                super.onCreate(savedInstanceState);  
          
                TextView tv = new TextView(this);  
                tv.setText(helloWorldFromJNI());  
                setContentView(tv);  
            }  
          
            public native String helloWorldFromJNI();// native声明,表示这个方法来自Native层。实现过程已经在native层实现了  
          
            static {  
                System.loadLibrary("HelloWorld");// 加载库,前面的lib和,后缀名不用写  
            }  
        }  

  • 相关阅读:
    使用 ESP8266 制作 WiFi 干扰器
    苹果手机连接Wifi认证机制
    TK2 USB修复
    WiFi其他方法和WiFi事件响
    获取与esp8266连接的客户端的Mac地址 IP 端口 控制停止等问题
    WiFi其他方法和WiFi事件响应
    Arduino内部网页代理,网页穿透,公网访问Arduino内部网页
    ESP8266远程OTA升级
    分级基金及套利策略:申购套利、赎回套利、低折套利
    maven安装
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6154885.html
Copyright © 2011-2022 走看看