用户工具

站点工具


android_ndk_notes

Android NDK 笔记

Resource

Installation

  1. 把下载的压缩包解压,如 /Users/2ndboy/android-ndk-r8b
  2. 在 .bash_profile 里设置 NDK 环境变量
    • export ANDROID_NDK_ROOT=/Users/2ndboy/android-ndk-r8b
  3. 在 .bash_profile 里设置路径(为了在任何地方执行 ndk-build)
    • export PATH=${PATH}:/Users/2ndboy/android-ndk-r8b

Sample

创建一个新 Android 工程,package name 为 com.2ndboy.testndk

MainActivity.java 内容如下:

public class MainActivity extends Activity
{
	public native int test( int a, int b );
 
	static
	{
		System.loadLibrary( "testndk" );
	}
 
	@Override
	public void onCreate( Bundle savedInstanceState )
	{
		super.onCreate( savedInstanceState );
		setContentView( R.layout.activity_main );
 
		Log.e( "NDK", String.valueOf( test( 2, 5 ) ) );
	}  
}

在工程目录下创建 jni 文件夹,里面有两个文件:

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := testndk
LOCAL_SRC_FILES := test.c
LOCAL_LDLIBS    := -llog
include $(BUILD_SHARED_LIBRARY)
  • LOCAL_PATH - 用于在开发树中查找源文件

test.c

#include <jni.h>
#include <android/log.h>
 
JNIEXPORT jint JNICALL
Java_com_2ndboy_testndk_MainActivity_test(
	JNIEnv  *env,
	jobject  this,
	jint     a,
	jint     b )
{
	return( a + b );
}

关于函数名 Java_com_2ndboy_testndk_MainActivity_test:

  • Java - 固定前缀
  • com_2ndboy_testndk - package name
  • MainActivity - class name
  • test - function name

在 jni 目录下执行 ndk-build 来生成 .so,.so 编译好以后会被自动复制到 libs/armeabi 目录下

基本数据类型

Java Language Type Native Type Description
boolean jboolean unsigned 8 bits
byte jbyte signed 8 bits
char jchar unsigned 16 bits
short jshort signed 16 bits
int jint signed 32 bits
long jlong signed 64 bits
float jfloat 32 bits
double jdouble 64 bits
  • jobject (all objects)
    • jclass (java.lang.Class.instances)
    • jstring (java.lang.String.instances)
    • jarray (arrays)
      • jobjectArray (Object[])
      • jbooleanArray (boolean[])
      • jbyteArray (byte[])
      • jcharArray (char[])
      • jshortArray (short[])
      • jintArray (int[])
      • jlongArray (long[])
      • jfloatArray (float[])
      • jdoubleArray (double[])
    • jthrowable (java.lang.Throwable.objects)

把 NDK 编译集成进 Eclipse 工程里

  1. 在 Eclipse 里进入工程属性,切换到 Builder
  2. 点 New 按钮,选 Program 进入 Edit Configuration 对话框
  3. Location 设置为 ndk-build 的位置,Working Directory 设置为 Android.mk 所在的 jni 目录
  4. 在 Refresh tab 里选中 Refresh resources upon completion;然后选中 Specific resources,之后点击 Specific resources 按钮,在弹出的对话框中选中项目的 lib 目录,点 finish;选中 Recursively include sub-folders
  5. 切换至 Build Options tab,选中 Specify working set of relevant resources,然后点 Specify Resources 按钮,在弹出的对话框里选中工程的 jni 目录跟其中的所有文件;选中 tab 中的其余如下复选框
    • Allocate Console
    • Launch in background
    • Run the builder After a Clean
    • Run the builder During manual builds
    • Run the builder During auto builds
android_ndk_notes.txt · 最后更改: 2012/09/02 09:46 由 2ndboy