Android+NDK 入门备忘 ubuntu 11.10

本文介绍如何使用 Android NDK 进行开发,重点讲解了 JNI 技术的应用及其实现 Java 代码与 C/C++ 代码之间的交互。通过实例演示了创建 native 函数、编译 .class 文件生成 .h 头文件、编写 C 代码并最终编译生成 .so 库文件的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开始使用 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虚拟机上运行上面建立的工程,如下所示



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值