工具:Android本地代码生成器

在使用AndroidNDK开发的时候有个事情是很烦人的,那就是创建本地代码文件夹,生成本地代码文件和创建本地代码的编译文件。特别是实现本地方法的时候,也是比较烦人的,因为本地方法的名字实在是太长了。它的命名规范是:Java_package-name_class-name_method-name(arguments),稍一不留神就会有拼写错误,而导致长时间的调试。由于不勘忍受这样的折磨,也为了不重复同样的事情(DRY-Don't Repeat Yourself),于是就写了一个Java程序来做这件事。
这个小工具可以逐个检查Java文件,并创建含有本地方法文件,也即本地代码文件,生成Android.mk编译文件并更新Java文件,添加System.loadLibrary

具体的原则是这样:

  • 每个含有本地代码的Java文件,生成一个本地文件,其内含有该文件中的所有本地方法

  • 所生成的本地方法是符合标准的JNI,具体的形式是:

return-type Java_package-name_class-name_method-name(arguments){
}
也就是说,所需要做的只是实现这个方法。

  • 默认本地代码共享库的名字是Android项目的名字

有了这个小工具,就可以只在Java中声明本地方法,运行下这个工具,然后实现本地方法,再编译就可以了。
可以从这里下载这个小工具。解压后有三个文件一个是Java源码,一个是Jar包(genjni.jar),一个是Shell脚本(genjni.sh)。放上源码的原因是,如果有兴趣的朋友可以进行改进,但是改进后请
发我一份。下载后,最好修改下Shell脚本,把Jar文件的路径改成具体的存放路径,否则会报出找不到Jar文件的错误。最后把genjni.sh放到~/bin下面,为了使用时方便。使用的时候要在Android项目的根目录下面运行genjni.sh就可以了。
下面以一个实例方式演示下这个小工具的使用方法:
创建一个项目叫HelloJni,并创建一个HelloJniActivity,在其内声明一个本地方法getStringFromJni();并用有一个TextView用来显示getStringFromJni()返回的信息。另一个本地方法getStatusFromJni(int)是为了显示用的,没有使用。这是Java代码:

package com.hilton.hellojni; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloJniActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView text = (TextView) findViewById(R.id.text); text.setText(getStringFromJni()); } private native String getStringFromJni(); private native int getStatusFromJni(int type); } 写好 Java 代码后,从终端进入到项目的根目录下

$cd HelloJni $ls AndroidManifest.xml assets bin default.properties gen proguard.cfg res src $genjni.sh appplication HelloJni package name: com.hilton.hellojni class name: HelloJniActivity $ls AndroidManifest.xml assets bin default.properties gen jni proguard.cfg res src $ls jni Android.mk HelloJniActivity.c
打开查看 Android.mk HelloJniActivity.c

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := HelloJni LOCAL_SRC_FILES := HelloJniActivity.c include $(BUILD_SHARED_LIBRARY)
#include jstring Java_com_hilton_hellojni_HelloJniActivity_getStringFromJni(JNIEnv* env, jobject thiz) { } jint Java_com_hilton_hellojni_HelloJniActivity_getStatusFromJni(JNIEnv* env, jobject thiz, jint type) { } 再查看 HelloJniActivity.java 也被更新了,里面多了加载共享库的语句:

package com.hilton.hellojni; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloJniActivity extends Activity { static { System.loadLibrary("HelloJni"); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView text = (TextView) findViewById(R.id.text); text.setText(getStringFromJni()); } private native String getStringFromJni(); private native int getStatusFromJni(int type); }
剩下的工作就是实现本地方法了。
当然这个工具还是有很多问题,欢迎各位反馈,或给出改进意见。
另外,这个工具是用 Java 写的,更好的选择应该是用脚本来写,如 Perl Python 。还有就是,如果能把这个工具集成到 ADT 中,或是创造一个完全用于 NDK 开发的集成工具 ANDT ,能够像产生 R.java 那样的自动生成本地文件。比如做一个 ANDT 工具,集成到 Eclipse 中,能够自动当 Java 中有本地方法声明后就自动生成本地文件和编译文件。这将是多么美好的事情啊,将对 NDK 的开发有重大的帮助。我想, Google 应该会做一专门用于 NDK 开发的 Eclipse 插件,或是在 ADT 中加入对 NDK 的支持,因为 NDK 开放的接口越来越多,使用 NDK 开发者也将越来越多,基于 NDK 开发的应用也将越来越多( 2.3 及以后的版本,完全可以只用 NDK 开发出一个 Apk ,也就是说用纯 C/C++ 来开发应用)。希望这一天早些到来。

你可能感兴趣的:(工具:Android本地代码生成器)