您的位置:首页 > 移动开发 > Android开发

Android NDK开发学习:我的第一个NDK项目

2016-06-06 10:31 281 查看
NDK介绍:

 * 1,NDK是什么:可以参考安卓官网https://developer.android.com/ndk/index.html的介绍,网上也有很多的相关资料。

 * 2,什么场景可以用NDK:在上一篇文章Android
NDK开发之Hello-JNI!中有简单介绍。

 * 3,什么是交叉编译:一个平台上生成另外一个平台上可执行的代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

 * 4,JNI是什么:Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。其作用简单的说有以下两点:

      1、你可以使用JNI来实现“本地方法”(native methods),并在JAVA程序中调用它们。

      2、JNI支持一个“调用接口”(invocation interface),它允许你把一个JVM嵌入到本地程序中。本地程序可以链接一个实现了JVM的本地库,然后使用“调用接口”执行JAVA语言编写的软件模块。例如,一个用C语言写的浏览器可以在一个嵌入式JVM上面执行从网上下载下来的applets。

 * 5,什么是链接库,分为动态链接库及静态链接库。

       1、动态链接库:动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL
还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。

2、静态链接库:静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。格式如:#pragma comment(lib,"XXX.lib")。linux下的静态链接库编辑

linux下的静态链接库是*.a文件,与动态链接库.so对应。

linux下.a文件,如果编写了入口函数,也可以直接执行。

 * 6,make文件介绍:Android NDK开发中,Android.mk文件是在使用NDK编译C代码时必须的文件,该文件描述了哪些C文件将被编译且指明了如何编译。

 开始第一个NDK工程之旅:

 第一步:在Eclipse中新建Android项目,我的第一个NDK项目就叫FirstNdk。

第二步:开始之前先介绍cmd环境下的javah命令,如图:


接下来我们进入cmd窗口,进行到项目所在目录。

执行javah -classpath bin/classes -d 项目包名+类名。如图


维埃里报错,提示找不到类文件,怎么办?

  通常有两种解决方案:

   1,找到我们电脑中SDK文件目录中的platforms下任意一个版本android.jar包,添加到环境变量中。



2,在上图的cmd命令中把android.jar的目录也写进去。如图:



可以看到运行成功了。

第三步:此时我们刷新项目,可以发现,项目中自动添加了jni文件目录,在此目录中新建first.c文件。接下来就开始代码之旅啦。



第四步:编写first.c文件代码,从未接触过C,视频学习+百度写的:

#include <stdio.h>
#include <stdlib.h>
#include <com_ldm_firstndk_MainActivity.h>

JNIEXPORT jstring JNICALL Java_com_ldm_firstndk_MainActivity_getStringFromC(JNIEnv *env, jobject obj)
{
return (*env)->NewStringUTF(env,"My First JNI PROJECT!");
}第五步:从NDK工具包中的示例项目比如Hello-jni项目的jni目录下,把Android.mk文件和Application.mk文件复制到我们项目的jni目录下,做适当修改。我的Android.mk文件:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := first
LOCAL_SRC_FILES := first.c #指定c文件

include $(BUILD_SHARED_LIBRARY)


第六步:执行ndk-build命令,在cmd窗口,进行到项目所在的目录,执行ndk-build命令。执行结果后,我们的项目就会自动添加obj文件目录:



第七步:到止,我的第一个NDK项目就OK啦,运行工程如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: