`
zhiweiofli
  • 浏览: 515024 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android的NDK开发~Hellow world!

阅读更多

1、到Google官网下载adt-bundle----开发Android App的工具打包下载,下载后解压即可,免去开发环境的配置。

     然后下载NDK,建议下载最新版本的,(ps:之前下载过r8a的,有bug,导致编译很慢,r8b就没有),配置ADT中的NDK Path。

     ~~这样子就完成了NDK开发的全部准备了。

 

2、新建Android项目,step by step,这里就不罗嗦了...

 

3、ADT v20之后的版本,提供了较为友善的NDK开发支持(ps:所以一定要升级ADT到最新版本哦),Android Tools-->Add Native Support :



 

 然后是所如so的名称,也就是编译后,库的名称,默认即可,之后可以在mk文件上改的:


 

 完成后项目的结构会变成:

 

 

 我们重点关注jni文件夹的内容,文件里放置的是我们的源码(.h, .c, .cpp)和mk文件(即make文件,告诉编译器应该如何进行编译,详细请自行Google),默认自动生成的cpp基本是空白的,mk文件如下:



 上面mk文件定义了编译的路径(LOCAL_PATH),include的路径(BUILD_SHARED_LIBRARY),编译后库的名称(LOCAL_MODULE),编译源文件的路径(LOCAL_SRC_FILES)

 

 4、下面来一个例子:

 Scgps_Client.h

#include <string.h>
#include <jni.h>

#include <android/log.h>

#ifndef LOG_TAG
#define LOG_TAG "android-ndk"
#endif

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))

    头文件除了引用到C的头文件之外,还引用了android方面的头文件log.h,用以实现打印log。

 

 Scgps_Client.c

#include <Scgps_Client.h>

JNIEXPORT jstring JNICALL Java_com_scgps_client_MainActivity_sayHellow(JNIEnv* env, jobject thiz)
{
	const char * ret = "Hellow Form Ndk";

	LOGI("stationAndLines --> %s", ret);

        return (*env)->NewStringUTF(env, ret);
}

   .c文件里面就是实现Java的回调方法了,主要就是返回字符串“Hellow From Ndk”。

 

 MainActivity.java

 

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Toast.makeText(getApplicationContext(), sayHellow(), Toast.LENGTH_LONG).show();
	}
	
	public native String sayHellow();
	
	static {
              System.loadLibrary("Scgps_Client");
        }

}

 

    接着,我们一步步地解析:

    1、Java方面只管调用,倒是很简单,使用关键字native,声明本地方法,然后在静态代码块中加载本地库。

    注意,loadLibrary的参数是库的名称,也就是mk文件中LOCAL_MODULE定义的值。

    ps:之前也做过windows下Jni方面的开发,编译出来是dll,然后Java加载的参数就是dll的名称;

           但是ndk编辑的so文件名称却是libScgps_Client,这里有待研究...


 

    2、本地代码方面,回调方法的定义 JNIEXPORT jstring JNICALL Java_com_scgps_client_MainActivity_sayHellow(JNIEnv* env, jobject thiz); ,稍稍有点复杂,我尽量详述:

         首先是方法名,Java_com_scgps_client_MainActivity_sayHellow,这里与Java层是关系密切的,根据JNI的编程规范,调用的方法必须以Java开头,然后详细描述Java层native方法所在的详细信息,并以“_”分隔,区分大小写!

         因此,sayHellow是Java声明的本地方法,MainActivity是类名,com_scgps_client是包名。

         假如C定义的方法名称与Java声明的名称对不上,运行则会报错,抛出下面的信息:


  

        友情提示:

        使用JDK的javah生成JNI的头文件!

        先编译Java工程,之后项目目录下会有bin文件夹,bin存放编译好的class文件; 

        使用console,cd到bin目录下:

javah -classpath . -jni com.scgps.client.MainActivity 

 

       然后是参数:JNIEnv* env 和 jobject thiz

       开讲之前,先简单说明一下,Jni中与Java基本数据类型的映射关系:



      定义都在jni.h的头文件中,各看官可自行查阅,基本上Java中的各种数据类型,jni中都有定义,也提供了相应的转换方法,供C与Java之间传递。

 

      OK,现在让我们继续分析 Java_com_scgps_client_MainActivity_sayHellow(JNIEnv* env, jobject thiz);

 

      JNIEnv* env  : 指向 JNI 函数表的指针变量。

      jobject thiz    :  该参数的意义取决于该方法是静态还是实例方法(static or an instance method)。 

  •                           当本地方法作为一个实例方法时,第二个参数相当于对象本身,即 this;
  •                           当本地方法作为一个静态方法时,指向所在类;

      在上面的例子中,Java_com_scgps_client_MainActivity_sayHellow是一个实例方法,因为thiz指向Java对象本身!

 

      最后是返回值,jstring   

      很明显,这是返回Java字符串类型的值,通过 (*env)->NewStringUTF(env, ret); ,调用JNI函数表中的NewStringUTF方法,转换ret指向的字符串,使其能被Java所识别。

  

      最后的最后,当然就是编译、运行了:

      先看看现在的mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := Scgps_Client

LOCAL_SRC_FILES := \ Scgps_Client.c \

LOCAL_LDLIBS	:= -llog -landroid

LOCAL_STATIC_LIBRARIES	:= android_native_app_glue
	
include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue) 

      因为引用到Android的库,所以也要在这里声明一下,见LOCAL_LDLIBS和LOCAL_STATIC_LIBRARIES的值。

   

      总结几个开发中的技巧:

           由于CDT(eclipse开发c/c++的插件)开发时,依赖编译的结果,所以提示总是会滞后。如果提示源码中有错,或找不到include依赖时,不妨先查看一下mk文件是否已经描述清楚了,然后再rebuild一下。

           当整个编译的结构有大的改动时,也不要忘了clear project,在build~~。

   

  

  • 大小: 33.2 KB
  • 大小: 12 KB
  • 大小: 18.5 KB
  • 大小: 4.6 KB
  • 大小: 8.8 KB
  • 大小: 2.2 KB
  • 大小: 12.7 KB
分享到:
评论

相关推荐

    androidndk开发实战

    《Android NDK开发实战》是针对移动应用开发者的一份宝贵资源,主要涵盖了如何在Android平台上进行原生代码开发。NDK(Native Development Kit)是Google为Android提供的一个工具集,它允许开发者使用C和C++编写性能...

    非常强大的eclipse中android ndk开发环境的配置说明

    ### 非常强大的Eclipse中Android NDK开发环境的配置说明 #### 一、概述 本文档将详细介绍如何在Eclipse中配置Android NDK开发环境,并实现C/C++代码的自动编译以及通过Eclipse使用Ant生成JNI所需的头文件。配置流程...

    Android NDK 开发教程二

    ### Android NDK 开发教程概览 #### 一、引言 随着移动互联网技术的不断发展,Android 应用开发已成为软件行业中不可或缺的一部分。为了满足不同层次的开发需求,Google 提供了多种工具和技术栈,其中 Android NDK ...

    Android NDK 开发教程三

    ### Android NDK 开发教程之 Hello JNI 示例详解 #### 一、引言 在移动应用开发领域,Android NDK (Native Development Kit) 提供了一种使用 C 或 C++ 编写原生代码的方式,这对于提高应用程序性能至关重要。本文...

    android ndk开发实例代码

    这个"android ndk开发实例代码"提供了一个入门级的示例,帮助开发者理解NDK和JNI(Java Native Interface)的结合使用。 JNI是Java平台的标准部分,它为Java代码提供了调用本地(非Java)代码的能力。在Android开发...

    Android NDK 开发的官方文档(android ndk dev guide)

    **Android NDK 开发详解** Android NDK(Native Development Kit)是Google提供的一款工具集,允许开发者在Android应用中使用C和C++代码,从而利用原生编程语言的高性能和低级硬件控制能力。NDK的主要用途包括处理...

    androidNDK helloworld

    Android NDK(Native Development Kit)是Google为Android平台提供的一套工具集,允许开发者使用C、C++等原生代码来开发应用的一部分或全部功能。这个"androidNDK helloworld"资源就是一个入门级别的示例,旨在帮助...

    ECLIPSE下的androidndk开发

    本教程将指导你如何在Eclipse环境中集成Android NDK进行开发。 **1. 为什么要用NDK?** 使用Android NDK的主要原因是性能优化。原生代码可以直接与硬件交互,因此执行速度通常比Java更快。此外,NDK还可以用于利用...

    Android NDK开发轻松入门.pdf

    ### Android NDK 开发轻松入门知识点详解 #### 一、Android NDK 概述 **Android NDK**(Native Development Kit)是 Android SDK 的一个重要组成部分,它为开发者提供了使用 C 或 C++ 编写应用程序的功能,使...

    Android NDK开发流程

    ### Android NDK开发流程 #### 一、简介 在移动应用开发领域,Android平台因其开放性和灵活性而备受开发者青睐。为了充分利用硬件性能并实现高性能计算,Android提供了NDK(Native Development Kit)工具集,允许...

    《Android NDK 开发教程 - v1.0》PDF

    《Android NDK 开发教程 - v1.0》是一本专为Android开发者设计的深入学习NDK技术的指导书籍。NDK(Native Development Kit)是Google提供的一种工具集,允许开发者使用C和C++等原生代码来开发部分或全部Android应用...

    Android NDK 开发入门例子

    **Android NDK 开发入门详解** Android NDK(Native Development Kit)是Google提供的一款用于在Android平台上进行原生代码开发的工具集。它允许开发者使用C++和其他本地语言编写部分应用,以实现高性能计算或者...

    Eclipse NDK 开发之 HelloWorld

    Eclipse NDK 开发是Android应用开发中的一个重要领域,它允许开发者使用原生代码(如C++)来实现性能敏感的部分或系统级功能。在本篇文章中,我们将深入探讨如何利用Eclipse NDK进行HelloWorld应用程序的开发。 ...

    android ndk开发步骤和实例

    本教程将详细阐述Android NDK开发的步骤,并通过实例进行讲解。 一、Android NDK开发环境搭建 1. 安装SDK和NDK:首先,你需要下载并安装Android SDK和NDK。可以在Android开发者官网找到最新的版本。安装过程中,...

    android-ndk(android-ndk-r25b-windows.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++开发工具集。这个压缩包“android-ndk-r25b-windows.zip”包含了NDK的第25个版本,专为Windows操作系统设计。NDK的主要功能...

    Android NDK开发示例

    这篇教程将深入探讨Android NDK开发,为初学者提供一个全面的入门指南。 NDK的核心功能是允许开发者在Android应用中集成高性能的本地代码,这对于处理计算密集型任务、游戏引擎、音视频处理和加密算法等场景尤其...

    Android NDK开发PPT

    Android NDK(Android Native Development Kit)是Android应用开发中的一个重要工具集,它允许开发者在Android应用程序中集成C/C++编写的原生代码,以提高性能和利用已有的C/C++库。NDK的优势在于,对于那些对计算...

    android-ndk(android-ndk-r23b-windows.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C/C++开发工具集。这个"android-ndk-r23b-windows.zip"压缩包包含了NDK的第23个版本,专为Windows操作系统设计。NDK是Android应用...

    让我们来学习如何使用Android Studio 1.3搞NDK吧~.zip

    在这个开源项目"让我们来学习如何使用Android Studio 1.3搞NDK吧~.zip"中,你将找到一个名为"android-ndk-master"的项目,这可能是包含了使用Android Studio 1.3进行NDK开发的示例代码。通常,这样的项目会包括以下...

Global site tag (gtag.js) - Google Analytics