Android NDK简单实例和环境搭建

1.NDK和JNI简介:

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

(software development kit)软件开发包(只支持java语言开发)。

众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。
NDK包括了
  • 从C / C++生成原生代码库所需要的工具和build files。
  • 将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
  • 支持所有未来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.下载Android NDK  http://developer.android.com/tools/sdk/ndk/index.html 

我是用的NDK:

2.Eclipse配置




3.创建你的Android项目,里面创建一个java类,代码如下:
package com.example.ndkdemo;

public class Hello {
	//native 是NDK的关键词
	public static native String getString();

}
4.通过javah生成头文件,在命令提示符下操作:


刷新你的项目,得到如图的一个包


右键你的项目,创建一个名字,生成jni文件夹






Android.mk里面的代码如下:

-LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := Hello
LOCAL_SRC_FILES := Hello.c//这个是把 .cpp 后面的 pp 给删除了  剩下的代码不变

include $(BUILD_SHARED_LIBRARY)

头文件 com_example_nn_Hello.h 的代码如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_nn_Hello */

#ifndef _Included_com_example_nn_Hello
#define _Included_com_example_nn_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_nn_Hello
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_nn_Hello_getString
(JNIEnv *  env, jclass class);//这里改成这样的

#ifdef __cplusplus
}
#endif
#endif

 后缀为 Hello .c文件需做如下操作:
先去解压的NDK找到 这个路径
C:\Users\ti\Desktop\android-ndk-r9\platforms\android-18\arch-arm\usr\include



 
 上方关联之后 写 Hello.c 中的代码如下
#include <jni.h>
#include <Stdio.h>
#include <stdlib.h>



JNIEXPORT jstring JNICALL Java_com_example_ndkdemo_Hello_getString
  (JNIEnv *env, jobject obj){

	return (*env)->NewStringUTF(env,"你好");
}

MainActivity中的代码:
package com.example.ndkdemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;

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);//打印“你好”
	
}
   
}
  

































评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值