Android NDK简单实例和环境搭建

1.NDK和JNI简介:

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

(softwaredevelopment kit)软件开发包(只支持java语言开发)。众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。


NDK包括了
1、从C / C++生成原生代码库所需要的工具和build files。
2、将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文              件)中。
3、支持所有未来Android平台的一系列原生系统头文件和库
为何要用到NDK?
概括来说主要分为以下几种情况:
1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。

    
 JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。并非从Android发布才引入JNI的概念的。
简单来说,Android的NDK提供了一些交叉编译工具链和Android自带的库,这些Android的库可以让开发者在编写本地语言的程序时调用。而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。当然了,你也可以自己搭建交叉编译环境,而不用NDK的工具和库。然后生成库,只要规范操作,一样可以生成能让JAVA层成功调用的库文件的。

      NDK开发思路:1、下载NDK,并且配置ADT,

                                2、创建一个native方法,

                                3、通过javah生成头文件,

                                4、改cpp类的代码,

                                5、编辑c语言 ,

                                6、,添加application.mk文件,

                                7、运行

                               按照上述的思路开始一步一步执行


        NDK环境搭建:


       1、下载NDK http://developer.android.com/tools/sdk/ndk/index.html

NDK用10版本或者9版本的就可以。然后打开window——>Preferences——>Android——>

NDK——>NDK Location路径选择NDK存放的路径,如图。


注意:eclipce的新版本可能需要安装一个Ndk的J包com.android.ide.eclipse.ndk_23.0.2.1259578.jar



2、创建一个方法或者类,一般是新建一个类

package com.example.ndkdemo;  
  
public class Hello {  
    //native 是NDK的关键词  
    public static native String getString();  
  
}  

3、通过javah生成头文件,运行CMD:





4、刷新一下,就会出现头文件(.h)


    右键选择Android tools——>Add Native support,生成jni包

      close Project——>open Project——>右键选择Android tools——>Add Native support,

就会出现 jni包



把 .cpp的文件改成 .c



5、编译C语言 .mk 文件中的 .cpp 改成  .c

<span style="font-family:Microsoft YaHei;font-size:18px;">-LOCAL_PATH := $(call my-dir)  
  
include $(CLEAR_VARS)  
  
LOCAL_MODULE    := Hello  
LOCAL_SRC_FILES := Hello.c//把 .cpp 改成 .c 
  
include $(BUILD_SHARED_LIBRARY)  </span>

打开头文件 com_example_nn_Hello.h 

<span style="font-family:Microsoft YaHei;">/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_srcndk_Hello */
#ifndef _Included_com_example_srcndk_Hello
#define _Included_com_example_srcndk_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_srcndk_Hello
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_srcndk_Hello_getString
  (JNIEnv*, jclass); //复制此代码

#ifdef __cplusplus
}
#endif
#endif</span>

Hello .c文件需做如下操作:
打开NDK—>platforms—>android-18—>arch-arm—>usr—>include ,如图:


关联完毕以后打开.c文件,实现如下代码:

<span style="font-family:Microsoft YaHei;font-size:18px;">#include <jni.h>
#include <Stdio.h>
#include <stdlib.h>
#include "com_example_srcndk_Hello.h"

JNIEXPORT jstring JNICALL Java_com_example_srcndk_Hello_getString
  (JNIEnv  *env, jobject obj){
  return (*env)->NewStringUTF(env,"hello");
}</span>


(env,"hello")——>打印出来就是"hello"

 

    MainActivity中的代码:

public class MainActivity extends Activity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        System.loadLibrary("NDKdemo");//jni中后缀为.c的名字  
    }  
  
    public void cc(View v){ //他是一个按钮,点击按钮需要做的操作  
    String string = Hello.getString();  
    System.out.println(string);//打印“你好”  
      
    }  
     
}  


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值