他的第一个NDK的Demo

DEMO下载链接: http://download.csdn.net/detail/logicsboy/7535409

首先给你们恶补下啥是NDK:(我从百度Copy的)

NDK全称:Native Development Kit。

1、NDK是一系列工具的集合。

* NDK提供了一系列的工具,帮助开发人员高速开发C(或C++)的动态库,并能自己主动将so和java应用一起打包成apk。

这些工具对开发人员的帮助是巨大的。[1]

* NDK集成了交叉编译器,并提供了对应的mk文件隔离平台、CPU、API等差异,开发者仅仅须要简单改动mk文件(指出“哪些文件须要编译”、“编译特性要求”等)。就能够创建出so。

* NDK能够自己主动地将so和Java应用一起打包,极大地减轻了开发者的打包工作。

2、NDK提供了一份稳定、功能有限的API头文件声明。

Google明白声明该API是稳定的,在兴许全部版本号中都稳定支持当前公布的API。从该版本号的NDK中看出。这些API支持的功能很有限。包括有:C标准库(libc)、准数学库(libm)、压缩库(libz)、Log库(liblog)。

==========================================================

好了,接下来我们在了解了解啥时JNI  ?

JNI是Java Native Interface的缩写,中文为JAVA本地调用。

从Java1.1開始,Java Native Interface(JNI)标准成为java平台的一部分,它同意Java代码和其它语言写的代码进行交互。

JNI一開始是为了本地已编译语言,尤其是C和C++而设计的,可是它并最好还是碍你使用其它语言,仅仅要调用约定受支持就能够了。

========================================================

好了概念大致就是上面那样,接下来我们要看看怎么构建自己的第一个NDK程序咯。

步骤啥的有图的看图,有文字的看文字吧。

1.先创建AndroiddProject。创建一个helloNDK.java:

MainActivity.java文件:



watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9naWNzYm95/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

2.然后编译上述文件产生的 .class文件。由于eclipse保存之后,就会自己主动编译。

保存之后,去找你的.class文件吧、

找到helloNDK.class文件的路径。

3.使用javah工具,产出C语言的*.h头文件,

在项目project建立一个jni的目录.

打开Windows命令窗体,并进入jni文件夹区域,运行javah工具去读取上述的            helloNDK.class文件,从而生成*.h头文件。输入命令:



watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9naWNzYm95/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

然后回车,注意文件夹别弄错了。然后会在jni文件夹以下生一个com_misoo_pk01_helloNDK.h的文件,当然你也能够设定生成的文档的名称。

命令例如以下:javah -o helloNDK.h -classpath ../bin/classes com.misoo.pk01.hellNDK

生成的com_misoo_pk01_helloNDK.h文件内容例如以下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_misoo_pk01_helloNDK */

#ifndef _Included_com_misoo_pk01_helloNDK
#define _Included_com_misoo_pk01_helloNDK
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_misoo_pk01_helloNDK
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_misoo_pk01_helloNDK_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

最好不要自己手动去改动它吧,我也懒的去试,毕竟这是命令生成的。

不关我们的事。

4.然后我们就能够把这个*.h的文件。交给C端开发人员去,结合JNI语法,撰写xxx.c的代码,

我们如今的这个程序的xxx.c的代码例如以下(前提你的代码和我的一样)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "com_misoo_pk01_helloNDK.h"

JNIEXPORT jstring JNICALL
	Java_com_misoo_pk01_helloNDK_sayHello
		(JNIEnv *env, jobject thiz){

		return (*env)->NewStringUTF(env,"Hello,NDK....");
}

5. 我们须要在NDK包的安装文件夹下拷贝一个Android.mk的文件到jni文件夹,而且内容为:

# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := helloNDK
LOCAL_SRC_FILES := com_misoo_pk01_helloNDK.c

include $(BUILD_SHARED_LIBRARY)

注意内容不能错了。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9naWNzYm95/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

6.接下来我就须要将这个项目放到NDK的samples文件夹以下

7.然后使用cygwin工具编译生成.so文件

编译的关键命令在找到文件夹之后:../../ndk-build然后回车即可了。

最后生成的.so文件你就能够粘到libs文件夹以下了

最后复制到你的项目中,開始run吧、

稍完成。

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-08-14 02:30:57

他的第一个NDK的Demo的相关文章

自己的第一个NDK的Demo

DEMO下载链接: http://download.csdn.net/detail/logicsboy/7535409 首先给你们恶补下啥是NDK:(我从百度Copy的) NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的.[1] * NDK集成了交叉编译器,并提供了相应的mk文件隔离平台.CPU.API等差

1.类的加载机制_继承类的加载(一个小的Demo)说明

今天我们先来一个小的Demo来了解类的加载顺序. 1 public class ClassLoaderTest { 2 public static void main(String[] args) { 3 System.out.println("*******************测试类的加载顺序开始*******************"); 4 new SubClass(); 5 System.out.println("*******************测试类的加载

Android NDK:②第一个NDK程序(创建步骤&amp;一些问题)

Android NDK:②第一个NDK程序(创建步骤&一些问题) 本节内容是:演示搭建第一个NDK程序 Android NDK第一个NDK程序创建步骤一些问题 创建一个Android Project Java代码中声明native方法 创建Jni文件夹编写ccpp代码 为项目添加NDK支持 新建配置一个Builder 调用了native方法的地方加载库 好了把程序跑起来 总结 遇到的问题 1.创建一个Android Project 直接创建一个新的Android Application Proj

【mvc学习】给小白们的第一个MVC学习Demo

首先用VS2012以上的VS创建一MVC网站,创建完后在解决方案视图应该有这些文件,我这里项目名称就叫taobao,你们可以自己取 加亮的地方是重点,也就是M-V-C,这时候默认已经可以运行了 大家可以右击,查看源代码,IE上好像叫查看源文件.会发现在已经引入的很多的JS,包括我们要用到的ajax请求的jquery,另外这个bootstrap是个好东西,用来布局网页,可以在PC和手机上使用一套界面,这个放后期我们再学习 <script src="/Scripts/jquery-1.10.2

使用TestStand默认ProcessModel--SequentialModel,快速搭建一个自定义过程模型Demo

TestStand 版本:2012 SP1 实现的的目标效果,如下图:使用TestStand默认ProcessModel--SequentialModel,快速搭建一个自定义过程模型Demo 步骤一: .准备工作 将TestStand ProcessModel 设置成--SequentialModel 设置Result Processing,这边启用Report记录  步骤二:  添加Model Callback 右击Sequence区域,选择Sequence File Callbacks,在出

第一个spring小demo

工作中用spring有一年多了,基本弄懂了bean配置文件的配置,但是却没有对spring配置文件,加载有更多的认识,今天动手写了第一个spring的小demo. 这个demo之前是想做web版的,但是web的启动比较麻烦,不如直接使用main方法执行直观,所以,就使用main方法来读取配置文件,启动spring. 看一下项目的结构  其中src部分是项目源码 和 配置文件applicationContext.xml WebContent 目录下面的WEB-INF/lib 目录下面存放的是spr

先从一个 libev 的 demo 入手

最近想研究下 libev 这个网络库,所以先从官方文档一个最简单的 demo 开始,代码如下: //io.c // a single header file is required #include <ev.h> #include <stdio.h> // for puts // every watcher type has its own typedef'd struct // with the name ev_TYPE ev_io stdin_watcher; ev_timer

【mvc学习】给小白们的第一个MVC学习Demo之Login篇

上次的Demo,只做了一个查询列表的功能,而且用的是ajax,今天我们来看下原味的mvc的过程,以登录为例,我们依旧是用sqlite数据库 按上次的步骤,我们已经有了一个可以跑的项目,接下来就是添加Login的Action和View以及Modals STEP 1 : 我们需要数据库支持,添加用户表users,字段如下 添加用户数据:insert into users(account,password,name) values('123','123','白茶程序员') STEP 2 :添加Moda

【转】WCF入门教程六[一个简单的Demo]

一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来学习的,我们学习WCF也是一样的.从简单来看(不包括安全.优化等相关问题),WCF的增删改查和WebForm相差无几.WCF只是把具体"实现"写在"Service端",而"调用"放在了"Client端".觉得有帮助别忘了点个赞哈,