前言,
??? 在这里用写个NDK的实例。
?
一,软件环境
??? WinXP SP3
??? Android SDK 2.2
??? Android NDK r5
?
二,调用方的 APP
??? 非常简单的应用程序,就是简单的调用一下 JNI 的函数。
??? HelloNDK.java
package net.dncsoft.android.sample;import android.app.Activity;import android.os.Bundle;public class HelloNDK extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); NDKBoundary ndkBoundary = new NDKBoundary(); int i = ndkBoundary.ndk_add(1, 2); i++; }}? ? NDKBoundary.java
package net.dncsoft.android.sample;public class NDKBoundary { static { System.loadLibrary("HelloNDKImpl"); } public native int ndk_add(int a, int b);}??? 编译生成 .class 文件。直接运行的话肯定出错。呵呵,废话,lib 还没做呢。
?
三,生成接口定义 H 文件
??? javah -o d:\HelloNDKImpl.h -classpath d:\WS\HelloNDK\bin net.dncsoft.android.sample.NDKBoundary
?
三,被调用的 LIB
??? HelloNDKImpl.cpp
#include <HelloNDKImpl.h>jint Java_net_dncsoft_android_sample_NDKBoundary_ndk_1add(JNIEnv* env, jobject thiz, jint x, jint y) { return x + y;}? ? Android.mk
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := HelloNDKImplLOCAL_CFLAGS := -WerrorLOCAL_SRC_FILES := HelloNDKImpl.cppinclude $(BUILD_SHARED_LIBRARY)?
??? 用上一讲的方法能编译成 libHelloNDKImpl.so 文件。
?
四,运行看看
??? 用下面命令启动模拟器,导入 LIB
cd %AndroidRoot%\toolsstart emulator -avd avdname -partition-size 512adb remountadb -s emulator-5554 push d:\libHelloNDKImpl.so /system/lib
??? 第 2 行命令是防止 Out of Memory 错误。
??? 第 3 行命令是防止 Read-Only 错误。
?
??? 现在可以运行 APP 啦。
?
五,Debug环境 (待续)