Android学习笔记:NDK入门一些总结

来源:互联网 发布:网络继电器 编辑:程序博客网 时间:2024/05/16 05:11

1、安装

        下载NDK包后,放到与SDK同级的目录下,并且配置好环境变量,配好后,在终端输入ndk-build命令测试,出现如下情况,则代表安装成功

Android NDK: Could not find application project directory !    Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.    /home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: *** Android NDK: Aborting    .  Stop.

 

2、工程与代码

        a、新建android工程,编写java代码,写好需要的本地方法,以及加载的c文件名字

        b、根据写好的java代码,生成.h的c文件,其中生成.h文件的步骤如下:

                1、进入该项目的目录下

                       braincol@ubuntu:~$ cd workspace/android/NDK/hello-jni/

                2、ls查看工程文件

                      braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ls
                      AndroidManifest.xml  assets  bin  default.properties  gen  res  src

                3、在工程目录下建立一个jni文件夹:

                      braincol@ubuntu:~/workspace/android/NDK/hello-jni$ mkdir jni
                      braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ls
                      AndroidManifest.xml  assets  bin  default.properties  gen  jni  res  src

                4、执行如下语句就可以生成相应的.h文件了:

                      braincol@ubuntu:~/workspace/android/NDK/hello-jni$ javah -classpath bin -d jni com.example.hellojni.HelloJni

        c、根据b中生成好的.h文件来编写相应的.c文件,根据自己的需要实现.h文件中的方法

        d、编写Android.mk文件,其格式为如下:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := hello-jni           //编译的目标对象,系统将会生成 'libhello-jni.so'文件,供java文件调用LOCAL_SRC_FILES := hello-jni.c         //编译的源文件,系统将根据该文件来生成目标对象include $(BUILD_SHARED_LIBRARY)

        e、生成.so共享库文件,在终端进入到该项目的目录下,输入ndk-build命令,即可在lib目录下生成.so文件,运行该项目,即可。

 

3、调试语句输出

        在 NDK 中, printf() 没法输出,所以我们需要借助 log 库来将我们 c 代码库中需要输出的内容,通过 java 控制台输出。调用函数 __android_log_print(), 就可以在 Eclipse 中,查看 LogCat 来查看相关的输出信息了。 

 

于是在c文件的编写中,需要引入android/log.h文件:

#include <android/log.h>

同时声明打印方法:

#define  __android_log_print(......);例如:

#include <string.h>#include <stdio.h>#include <jni.h>#include <android/log.h>#define LOG_TAG "MYJNI"#define LOGI(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)static char s_string[] = "My god, I did it!";jstringJava_com_jpf_myjni_MyJNI_stringFromJNI( JNIEnv* env,jobject thiz ){       LOGI("MyJNI is called!");       return (*env)->NewStringUTF(env, s_string);} 

 

因为打印是链接的log库,所以在Android.mk文件中加上如下一句:

LOCAL_LDLIBS += -llog

重新ndk-build,运行项目,可以在logcat中发现我们在c文件中加的打印语句。

 

参考:

http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html

http://blog.csdn.net/xuxinyl/article/details/6409030