开始使用 Android NDK 进行开发,NDK 的主要原理还是JNI技术,这一技术实现了 Java代码和 C/C++代码间的相
互调用,这样做的好处是:
a. 将一些比较耗时的操作放到底层来实现,毕竟C和C++的效率高比Java高,并且指针是可以加快程序的运行速度;
b. 在C语言领域,已经有很多成熟的类库和框架,使用NDK后,可以直接使用他们,因而避免再用Java去重复制造轮子。
Android NDK的开发,需要Linux的编译环境,所以建议直接装个Linux系统,在上面进行Android开发,当然也可以使用
虚拟机来代替,不过个人觉得虚拟机始终不伦不类,还是真正的Linux环境比较顺手。
使用NDK时的大致步骤如下:
1.新建一个Android 工程,在里面新建一个jni 文件夹,专门用来存放 C 语言程序和Android.mk 文件
2.在java文件中编写一个 native 函数
View Code
package tangyuchun.ndk.hellojni;
public class HellojniActivity extends Activity {
static {
System.loadLibrary("hello-jni");
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText(getString());//调用了native方法
setContentView(tv);
}
public native static String getString();
}
这里是一个简单的Activity界面,里面定义了一个 getString()方法,用来获取一个字符串。
3.打开终端,使用 javah -classpath 命令编译 bin/classes 下生成的 .class文件。我的命令如下:
javah
- classpath
/ home / administrator / android_code / hello - jni / bin / classes
tangyuchun.ndk.hellojni.HellojniActivity
|
也可以在src的 .java 源代码中使用同样的命令:
javah -classpath /home/administrator/android_code/hello-jni/src tangyuchun.ndk.hellojni.HellojniActivity
记得在前面要加上包名(我的是在tangyuchun.ndk.hellojni这个包下面)
4.经过第3步后,就会在该类目录下生成一个 .h 的头文件(ubuntu也有可能生成在主文件夹下面),
名字为tangyuchun_ndk_hellojni_HellojniActivity.h,打开这个头文件,内容如下
View Code
#include <jni.h>
/* Header for class tangyuchun_ndk_hellojni_HellojniActivity */
#ifndef _Included_tangyuchun_ndk_hellojni_HellojniActivity
#define _Included_tangyuchun_ndk_hellojni_HellojniActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: tangyuchun_ndk_hellojni_HellojniActivity
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
5.看到里面有一个 函数:
JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(JNIEnv *, jclass);这个方法就与第2步的getString()对应。
6.在jni 文件夹中新建一个 c语言文件,我的是 hello-jni.c ,include相应的头文件,然后将第4步中的那个方法复制,完成该方法:
View Code
#include <string.h>
#include <stdio.h>
#include <android/log.h>
#include <stdlib.h>
#include <jni.h>
JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(
JNIEnv *env, jclass thiz) {
return (*env)->NewStringUTF(env, "Some say love");
//这里只是做个样例,所以只让他返回一段字符串 "Some say love"
}
注意,要给方法添加参数,头文件中只是声明,并没有实参。
7.同样,在 jni 文件夹下面新建一个 Android.mk 文件,内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
那个LOCAL_MODULE 就是将要生成的.so 文件名,LOCAL_SRC_FILES就是第6步中编写的 .c 文件。
8.保存上述文件,打开终端,定位到工程的目录下的jni 文件夹,在终端输入: ndk-build 命令,回车。
9.返回到工程文件夹下,就会看到生成了两个文件夹 libs 和 obj,其中 libs/armeabi/ 文件夹下面就有三个文件,分别是gdb.setup,gdbserver
和libhello-jni.so文件,这个.so文件其实就是用来在android中调用C语言的类库
10. 在Android虚拟机上运行上面建立的工程,如下所示
分享到:
相关推荐
Android+NDK+CYGWIN开发文档
android+NDK 开发.pdf 介绍NDK 开发的流程和简单例子介绍
android+eclipse+ndk环境搭配 适合高效率的android 编程,混合编程
Android+Eclipse+NDK+cygwin开发环境的搭建
Android+OpenCV+NDK完整实例源码,自己加入openCVLibrary342库和拷贝libs、staticlibs文件加入
Android+ndk
android+opengl es+ndk学习三维android开发重要资料,底层c实现,很经典
通过查看海量的网络资源,亲自整合,整理出了一套完备的Java开发环境配置、Android开发环境配置、Android NDK开发环境配置的全面教程。其中NDK的开发通过环境配置,再也不用进行单个文件的建立以及命令行javah进行...
一个使用NDK技术通过JNI实现android Java层与C层的数据交互,并结合OpenGL_ES 在C层实现一个3D效果代码,在Java层用于显示的软件。
在Android下用C/C++开发,新版本的配置不需要cygwin
android开发,在ndk下,实现点,线的抗锯齿,可是点画出点,而不是方框,线也比较平滑
学习Android_NDK入门很简单学习Android_NDK入门很简单学习Android_NDK入门很简单学习Android_NDK入门很简单
后来结合网上说的让后加上自己摸索,终于可以用eclipse + NDK + Cygwin编译出so文件并且能够直接运行helloJNI程序了,现在把我的经验和大家分享,希望对大家有帮助。(想起来了,我的Cygwin是下载到本地然后安装的,...
android-ndk(android-ndk-r26b-windows.zip)适用于Windows系统
NDK:android-ndk-r9c-windows-x86_64 CDT: cdt-master-8.2.1 ADT:ADT-22.2.1 cocos2d :cocos2d-x-2.2.1 由于个版本更新很快,大家使用新版本配置的时候可能发生问题,写下自己的一点心得希望能帮到大家
android-ndk(android-ndk-r25b-windows.zip)适用于Windows系统
Android NDK入门
android-ndk(android-ndk-r25b-linux.zip)适用于Linux系统
针对Android平台编译好的FFmpeg 6.0的动态链接库.so文件,包括armeabi-v7a ,arm64-v8a两个版本.
ubuntu 14.04 + NDK10d+ffmpeg 3.0编译出来的库和头文件。可以在安卓环境下使用。