Android NDK开发简单程序分享(Hello Word!)

在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力。这里我们选择使用C+JAVA开发Android程序,首先你必须了解C语言、JAVA语言以及Linux操作系统,这样可以帮助你开始上手,当然不是说你必须是大牛才能进行NDK开发,下面我们来一起实现一个简单的NDK程序。

第一步,创建Android工程

打开开发环境eclipse,在左侧空白区域,右键单击创建Android工程(非常简单,不再赘述)。

第二步,编译头文件

打开我们的主Activity,在里面定义一个native类型的方法:

public class MainActivity extends Activity {
 public static native String getStringFromC();
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.main, menu);
 return true;
 }
}

创建好我们的Android工程后,并定义好方法之后,然后在目录下新建一个jni目录,之后点击运行输入cmd回车-->通过cd命令进入当前的工程目录

然后通过javah命令生成我们的头文件,下面先看一下javah命令吧:

这里我们主要使用到-d、-jni、 -classpath,下面我们来生成我们的头文件,在命令行输入:

javah -classpath bin/classes -d jni com.edu.hpu.jni.MainActivity

遇到这个问题是因为我们的calsspath在编译时,没有找到Android.jar文件导致的,错误信息如下:

这个问题很好解决,第一种方式,我们在环境变量calsspath下添加一个Android.jar文件的目录即可,Android.jar文件存在于我们的Android SDK文件夹,platforms文件夹下存在很多Android版本,我们任意选一个打开,我们就找到了我们需要的Android.jar文件,然后将地址配置到环境变量classpath下即可;第二种方式我们在命令行设置一个路径即可:

这样我们的头文件就生成了,最下化我们的命令行窗口,因为随后我们还要使用,完成上面的操作,我们刷新一下工程,这是在jni目录下会对一个头文件:com_edu_hpu_jni_MainActivity.h(文件名因工程而异),下面我们在jni目录下新建一个.c文件:

#include <stdio.h>
#include <stdlib.h>
#include "com_edu_hpu_jni_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_edu_hpu_jni_MainActivity_getStringFromC(JNIEnv* env, jclass this){
 return (*env)->NewStringUTF(env, "Hello from JNI !");
}

Java_com_edu_hpu_jni_MainActivity_getStringFromC简单说一下这个名字,Java_是固定前缀,com_edu_hpu_jni_MainActivity:主activity包名+类名,getStringFromC:方法名

这里为了防止我们写错,我们打开刚刚生成的头文件,从里面拷贝出来:

到这里我们的任务即将完成,下面我们将之前demo工程的jni目录下的Android.mk拷贝到我们的工程jni目录下,然后双击打开:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE:指我们.c文件的访问标记;LOCAL_SRC_FILES:指我们在jni目录下新建的.c文件。

最后我们需要在我们的主Activity中进行调用.C类库:

public class MainActivity extends Activity {
 static{
 System.loadLibrary("hello");
 }
 public static native String getStringFromC();
 private TextView text;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 text = (TextView) findViewById(R.id.hello);
 text.setText(getStringFromC());
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.main, menu);
 return true;
 }
}

做完上面的工作,我们打开我们的命令行窗口,输入ndk-build编译生成.so类库

操作成功后,我们刷新一下工程,会发现obj目录下增加了一个.so文件:

然后我们点击运行工程,这样我们的第一个NDK程序就算完工了,最后附一张图:

上面提到的命令行方式生成.so文件是不是感觉很麻烦,接下来请和我一起探究一下如何使用编译工具eclipse完成上面的操作。

第一步:安装ndk

安装方式详见Android NDK开发入门

第二步:配置eclipse

首先我们需要将ndk环境配置到eclipse:点击 window-->perferences:

然后选择Android-->ndk-->将我们的ndk安装目录添加进来:

到这里我们的配置基本完成,最后给我们的工程配置一个启动ndk-build的路径,选择我们的工程右键单击选择properties:

好了,我们的eclipse编译ndk程序的配置就算大功告成,大家快去试一下吧,超级方便。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • Android NDK 生成以及调用so 文件

    1.使用NDK来生成so文件: hello-jni.c 函数名Java +包名+函数名字 2.修改Android.mk文件 LOCAL_SRC_FILES :=hello-jni.c 指定c++文件 3.编译so文件 4.调用so文件 so文件copy到android项目的libs/armeabi目录下 最后输出一下结果: 以上就是本篇文章对Android  JNI开发流程的梳理,希望可以帮助开发 JNI的朋友.

  • android开发实践之ndk编译命令简单示例

    前言 Android提供了NDK工具,用来编译native代码(c/c++),该工具配置好了相关的交叉编译环境和工具链,只需要你简单地编写几个.mk文件即可将你的c/c++代码编译为Android的java工程/Android手机可以识别.加载和运行的库或者应用程序. 默认情况下,使用NDK编译c/c++代码,需要将该代码放置到任一个Android应用工程的jni目录下,然后编写相应的Android.mk文件,并执行ndk-build命令完成编译.其实你也是可以在任意目录下去编译native代码

  • Android NDK开发的环境搭建与简单示例

    一.NDK与JNI简介 NDK全称为native development kit本地语言(C&C++)开发包.而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发). 简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用.NDK开发的可以称之为底层开发或者jni(java native interface)层开发,SDK开发可以称为上层开发. Andro

  • Android开发的IDE、ADT、SDK、JDK、NDK等名词解释

    1. IDE: Intelligent Development Environm的简称.即智能开发环境.是一种开发工具.常用的IDE有adt-bundles和Android studio.两个都需要配置jdk. 2. ADT: Android Development tools的简称.即Android开发工具.ADT为Eclipse的插件.在Eclipse和SDK之间起了一个桥梁的作用. 3. SDK: Soft Development Kit的简称.软件开发工具包.在Android中,它为开发

  • Android NDK开发详细介绍

    Android之NDK开发 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言.但这并不等同于"第三方应用只能使用Java".在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,"Java+C"的

  • Android NDK开发入门

    神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理,通过在线视频教育网站,我初步了解了NDK的神秘面纱,好东西自然要分享,接下来我们就一起来认识一下Android NDK开发. 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三

  • Android NDK开发之:配置环境的详解

    一.Windows:Windows下的开发环境需要安装以下软件:Java JDK Apache ANT Build SystemAndroid SDKCygwinAndroid NDKEclipse IDE1.安装Java JDKhttp://www.oracle.com/technetwork/java/javase/downloads/index.html配置环境变量:新建一个JAVA_HOME键,值设为JDK的安装目录.打开PATH键,在末尾增加 ;%JAVA_HOME%\bin检测:ja

  • Android 驱动编写LED-NDK程序

    1. 首先编写LINUX内核模块LED #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/device.h> #include <asm/io.h> #include <asm/uaccess.h> #include <linux/cdev.

  • NDK 数据结构之队列与栈等的实现

    NDK 数据结构之队列与栈等的实现 com_tz_ndk_cpp_NDKCpp.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_tz_ndk_cpp_NDKCpp */ #ifndef _Included_com_tz_ndk_cpp_NDKCpp #define _Included_com_tz_ndk_cpp_NDKCpp #ifdef __cp

  • Android NDK开发简单程序分享(Hello Word!)

    在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android程序,首先你必须了解C语言.JAVA语言以及Linux操作系统,这样可以帮助你开始上手,当然不是说你必须是大牛才能进行NDK开发,下面我们来一起实现一个简单的NDK程序. 第一步,创建Android工程 打开开发环境eclipse,在左侧空白区域,右键单击创建Android工程(非常简单,不再赘述)

  • Android NDK开发(C语言-文件读写)

    目录 1.文件读写 1.1打开文件 1.2关闭文件 1.3读取文件 1.4写入文件 1.5读写二进制I/O文件 1.6获取文件的大小 1.7文本简单加密.解密 1.8二进制文件简单加解密 1.文件读写 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节.C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件. 1.1打开文件 我们可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FI

  • Android NDK开发(C语言基本数据类型)

    目录 1.C 语言包含的数据类型 2.C语言的基本数据类型 3.示例代码 1.C 语言包含的数据类型 如下图所示: 2.C语言的基本数据类型 short.int.long.char.float.double 这六个关键字代表C 语言里的六种基本数据类型. 格式化输出的时候: int %d short %d long %ld float %f double %lf char %c %x 十六进制 %o 八进制 %s 字符串 %p一般以十六进制整数方式输出指针的值,附加前缀0x 在32 位的系统上s

  • Android NDK开发(C语言--动态内存分配)

    1.C 内存管理函数 C 语言为内存的分配和管理提供了几个函数.这些函数可以在 <stdlib.h> 头文件中找到. 序号 函数和描述 1 void calloc(int num, int size); 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0.所以它的结果是分配了 numsize 个字节长度的内存空间,并且每个字节的值都是0. 2 void free(void *address); 该函数释放 address 所指向的内存块,释放的是动态分配的

  • Android NDK开发(C语言--联合体与枚举)

    目录 1.联合体 1.1定义共用体 1.2共用体占用的内存应足够存储共用体中最大的成员. 1.3联合变量任何时刻只有一个变量存在,最后一次赋值有效 1.4JNI头文件中的联合体 2.枚举 1.联合体 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型.您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值.共用体提供了一种使用相同的内存位置的有效方式. 1.1定义共用体 为了定义共用体,您必须使用 union 语句,方式与定义结构类似.union 语句定义了一个新的

  • Android NDK开发(C语言字符串)

    目录 1.C语音的字符串有两种 1.1字符数组 1.2字符指针 2.字符串常用的方法 2.1strcpy字符串拼接 2.2strchr字符串中查找字符 2.3strchr字符串中查找字符 2.4更多用法... 1.C语音的字符串有两种 1.1字符数组 数组可以修改其中某一个值,不可以整体赋值. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <Windows.h&g

  • Android NDK 开发教程

    Android NDK 是在SDK前面又加上了"原生"二字,即Native Development Kit,因此又被Google称为"NDK". 众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序. NDK包括了: 从C / C++生成原生代码库所需要的工具和build files. 将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages fi

随机推荐