Android NDK开发(一)HelloWorld
来源:互联网 发布:张纪中版神雕侠侣 知乎 编辑:程序博客网 时间:2024/05/17 22:34
相关概念
1、什么是NDK?
The NDK is a toolset that allows you to implement parts of your app
using native-code languages such as C and C++. Typically, good use
cases for the NDK are CPU-intensive applications such as game engines,
signal processing, and physics simulation.
NDK是工具,包括编译链接nitive代码的功能,调试功能。
2、什么是jni?
The JNI is a native programming interface. It allows Java code that
runs inside a Java Virtual Machine (VM) to interoperate with
applications and libraries written in other programming languages,
such as C, C++, and assembly.
JNI是语言层面上让java和c/c++可以交互的基础。
3、什么是javah?
使用Javah 可以获取您的 Java 源文件并生成 C/C++头文件,其中包含您的 Java 代码中所有本地方法(native方法)的 JNI 存根(stub,C头文件)。
参数:
4、什么是javap?
javap是JDK自带的反汇编器,我们可以通过它获得方法的签名。
搭建环境
这里我用Eclipse进行NDK开发,后面的文章会写在Android Studio上搭建NDK环境:
1、下载NDK并解压
下载地址在这里http://developer.android.com/ndk/downloads/index.html
,为了以后使用方便,把解压后的路径添加到PATH环境变量。
2、安装cygwin
cygwin是在windows系统下模拟一个linux环境的工具,因为NDK里的脚本需要在linux环境下执行,当然也有windows的脚本,但是有时会出现莫名其妙的问题。如果是linux或ma ox用户不用安装。https://cygwin.com/install.html
PS
在上面的下载过程中如果被墙,可以自行百度,应该有不少好心网友传到网络硬盘里的。
Hello World
在这里实现一个方法,使用java调用c语言的方法,在控制台打印Hello World。
1、在java代码里编写包含native关键字的方法。
public class MainActivity extends Activity { static { System.loadLibrary("helloworld"); } public native void helloWorld(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); helloWorld(); }}
2、在命令行,cd 到src目录下,执行命令
javah -jni net.qingtian.qttestc.MainActivity
就会在src目录下生成一个net_qingtian_qttestc_MainActivity.h的头文件。
3、在项目跟目录下创建jni文件夹,把第二步生成的net_qingtian_qttestc_MainActivity.h头文件拷贝在该目录下。
4、 在jni目录下新建一个c代码源文件,叫helloworld.c,在helloworld.c里实现net_qingtian_qttestc_MainActivity.h头文件里的方法
#include "net_qingtian_qttestc_MainActivity.h"#include <android/log.h>JNIEXPORT void JNICALL Java_net_qingtian_qttestc_MainActivity_helloWorld (JNIEnv * env, jobject obj){ __android_log_print(ANDROID_LOG_INFO, "qingtian", "Hello World From C");}
关于打印log的方法,可以去${ndk_dir}/platforms/android-14/arch-arm/usr/include/android/log.h头文件里去查看。
5、 在jni下编写Android.mk
这是和编译打包有关系的脚本文件
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# 对应打包成函数库的名字LOCAL_MODULE := helloworld# 对应c代码的文件LOCAL_SRC_FILES := helloworld.cLOCAL_LDLIBS += -lloginclude $(BUILD_SHARED_LIBRARY)
关于Android.mk文件的更多介绍,可以去${ndk_dir}/docs/ANDROID-MK.html查看。
6、编译共享库。
在linux环境下切换到项目根目录(cygwin),执行ndk-build命令。
这说明共享库已经生成了,如果在编译的时候c/c++有错误,根据输出进行修改。如果修改了c/c++代码,重新编译的时候,要把项目根目录下的obj文件夹删除掉,再重新编译。
7、运行项目。
- Android NDK开发(一)HelloWorld
- android-ndk开发helloworld
- Android NDK入门(一) -- HelloWorld
- Android NDK开发之HelloWorld
- android NDK开发(一)
- Android-NDK开发(一)
- Android开发(一)Android搭建、HelloWorld
- android-NDK学习开发二--HelloWorld
- Android之NDK开发之HelloWorld
- NDK开发(一):Android NDK环境搭建
- Android JNI/NDK开发(一)NDK真的很难吗?
- Android NDk-JNi开发(一)NDK环境变量的配置
- JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld
- JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld
- JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld
- JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld
- JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld
- JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld
- Sexy Beach PR 汉化补丁+新手教程
- InnoDB创建数据压缩页
- C#大框架小要素
- SQL语句,数据库的创建、定义修改删除基本表
- php学习日记第十棒(switch 语句)
- Android NDK开发(一)HelloWorld
- 【C++】深度探索C++对象模型之执行期语意学
- xUtils中的HttpUtils请求网络数据和BitmapUtils加载网络图片
- 《TCP/IP详解 卷1:协议》 读书笔记 第23章 TCP的保活定时器
- Codeforces Round #336 (Div. 1) D. Power Tree
- 常用正则表达式大全
- 【GLSL教程】(四)shder的简单示例
- ThinkPHP 模块与操作
- 关于4.X系统使用安卓5.0Material风格AlertDialog全屏问题