本文将详细的记录第一次使用ndk的相关内容,并以一个小例子来展开叙述。(在操作以下指令与编码前,请先配置ndk的环境变量,方法与jdk配置相同,只需配置bin目录即可)
当前操作全部是在eclipse中进行,android studio暂时不能全面支持ndk。
package com.example.hellondk; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { static { System.loadLibrary("hello"); } public static native String getStringFromC(); private TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView)findViewById(R.id.text); //System.out.println(getStringFromC()); text.setText(getStringFromC()); } }
其中 public static native String getStringFromC();要率先书写,这个native方法将通过javah指令去生成一个java的头文件:
1.手动创建一个名为“jni”的目录。
2.将cmd打开,切换到当前项目的目录下。执行命令,javah -classpath bin/classes;D:\sdk_r10\platforms\android-18\android.jar -d jni com.example.hellondk.MainActivity
[注]:javah -classpath bin/classes;[sdk\platforms\任一版本\android.jar] -d [生成文件存放的文件夹] [包名.类名]
3.在jni目录下创建一个c语言的文件,引入之前编译好的.h文件
#include<stdio.h> #include<stdlib.h> #include 'com_example_hellondk_MainActivity.h' JNIEXPORT jstring JNICALL Java_com_example_hellondk_MainActivity_getStringFromC (JNIEnv *env, jclass jclass){ return (*env)->NewStringUTF(env, "你好,世界") }4.在jni目录下引入Android.mk文件(可复制,无需记忆)
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.c include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE是指定编译过后的so叫什么名字
LOCAL_SRC_FIFES是指编译哪个c文件
5.在当前目录下,cmd中执行 nkd-build
执行过后会在obj->local->armeabi 目录下发现so文件,名为libhello.so。
6.回到Activity中,使用
static { System.loadLibrary("hello"); }
加载so包,万事大吉,可以调用
public static native String getStringFromC();完成ndk调用了。