NDK初试

初步使用NDK,这篇文章里从环境搭建,到运行helloWorld。没有更深的内容,只适合从来没有玩过NDK的同学看。

环境搭建

从NDKr8开始NDK中内置了Windows环境下的ndk-build,不需要再安装cygwin这个玩意了。值得庆幸…

  1. CDT插件安装
    • CDT官网获取插件下载地址
    • Eclipse中 Help-Install New Software-Add
    • 添加下载地址
    • 选择CDT Main Features分组下的C/C++ Development ToolsC/C++ Development Tools SDK两个插件,其他的不需要安装。
  2. NDK安装
    • 科学上网进入 NDK下载官网
    • 下载正确版本并双击自动解压
    • 把解压后或者你拷贝后的路径添加到环境变量
    • 例如我的路径是E:\AndroidNDK
    • 在cmd里测试 ndk-build
    • 测试不成功说明你的环境变量没加对

建议

  1. 复习C/C++
  2. 先看NDK里的docs
  3. 再看NDK里的samples

Hello World

  1. 创建普通Android项目

    注意一定不要创建带有下划线的项目

  2. 新建C文件

小技巧

  • 准确创建c文件方法名

    创建Activity的时候先不要继承Activity,先像下面那样写
    把native方法写出来之后,cmd切换至 bin/class目录,执行
    javah com.houny.helloworld.TestJNI
    这个命令会在class根据了帮你生成一个.h头文件,方法名也在里面了。
    如果你在TestJNI.java里使用了中文,请使用
    javah -encoding utf-8 com.houny.helloworld.TestJNI

1
2
3
4
5
package com.houny.helloworld;
public class TestJNI {
public native String testJNI();
}
  • 使用LOG

    c文件里其实也是可以像普通java代码一样使用android提供的log的。使用方法如下,不过log内容只能是英文的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<stdio.h>
#include<jni.h>
#include"com_example_ndk_MainActivity.h"
#include <android/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_javaFromJNI(
JNIEnv* env, jobject obj) {
return (*env)->NewStringUTF(env, "hello jni!");
}
/*
* Class: com_example_ndk_MainActivity
* Method: java_From_JNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_java_1From_1JNI(
JNIEnv* env, jobject obj) {
LOGI("function called");
LOGI("array init");
char c1[3] = { 'a', 'b', 'c' };
char c2[2] = { 'd', 'e' };
LOGI("array init finish");
LOGI("copy array");
strcat(c1, c2); //把c2的内容放在c1的后面,要求c1长度>c2长度
LOGI("copy array finish");
return (*env)->NewStringUTF(env, "hello_jni__");
}