1 JNI工程建立
Android目录下创一个目录jnidemo,并在该目录下创建三个文件
n
n
n
创建过程如下:
cd android4.1 mkdir jnidemo cd jnidemo touch Android.mk touch jnidemo.cpp onload.cpp |
2 编辑jnidemo.cpp
vim jnidemo.cpp
#include"JNIHelp.h" #include "jni.h" #define LOG_TAG"Service-JNI" namespace android { } static JNINativeMethod method_table[] = { int register_android_jnidemo_Service(JNIEnv*env){ } }; |
n
n
n
3 编辑onload.cpp
#include"JNIHelp.h" #include "jni.h" #include"utils/Log.h" #include"utils/misc.h" namespace android{ int register_android_jnidemo_Service(JNIEnv*env); }; using namespaceandroid; extern "C" jint JNI_OnLoad(JavaVM* vm, void*reserved) { } |
当java代码调用System.loadLibrary()加载JNI库的时候,将调用到onload.cpp的JNI_OnLoad()方法,然后将调用在jnidemo.cpp文件中定义的方法register_android_jnidemo_Service(env)对JNI进行注册。其实很简单吧,onload.cpp就是完成注册功能的。
4 编辑Android.mk
LOCAL_PATH:= $(callmy-dir) include$(CLEAR_VARS) LOCAL_MODULE_TAGS :=eng LOCAL_SRC_FILES:=\ LOCAL_SHARED_LIBRARIES :=\ LOCAL_MODULE:=libjnitdemo include$(BUILD_SHARED_LIBRARY) |
Android.mk是android下面的makefile文件:
n
n
n
n
在jnidemo目录下执行mm命令(前提是构建好Android的环境),编译当前目录下,之后将在out产品目录下的system/lib/目录下生成libjnidemo.so文件
5 编辑java代码
package com.android.jnidemo; import android.util.Log; public class Service { String TAG="Service"; } |
n
n
n
n
我是在eclipse下面创建了一个Android apk的工程,在Activity的onCreate()方法中创建了Service的实例,即new Service(),这里就不写出来了。
6 代码执行
n
到out的产品目录的system/lib下执行adb pushlibjnidemo.ko
n
com.android.jnidemo com.android.jnidemo |
第一条是在JNI的nativeOpen方法中打印的,第二条是在Java代码中打印的。
看到这个结果,说明JNI已经ok了。