工具: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 <jni.h>

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代码生成器是一款生成安卓手机程序的代码生成器 基于分层模式设计思想,生成代码直接导入Eclipse软件就可以用的!   真正面向对象设计:系统的整体设计,提供通过使用面向对象的方法,设计所需系统中的基础对象(类),并根据专业级的“三层架构模板”生成专业级的界面和源代码,同时设计系统和数据库:采用“数据映射”建立基础对象(类)与数据表之间的关系,在设计类的同时,就可以完成关联表结构的设计!   轻松解决多表关联:多表关联一直是一个繁琐的问题,如一个员工属于一个部门。在设计基础对象(类)时,可以将部门类(不是部门编号)作为员工类的一个属性,自动生成表间关联代码,在界面上也可以实现部门名称的显示,及使用下拉框选择部门   系统实现了字符串,整数,小数,日期类型,图片类型这些常见类型的CRUD操作,并且实现了对象之间的外键关联!手机客户端主要包括了以下目录结构代码的自动生成:  com.mobileclient.activity:充当界面层(界面描述在布局文件中)和控制层(控制程序的运行流程)。 com.mobileclient.domain:实体对象描述层,负责描述和封装对象的各个属性,在各个层次中进行数据流动。 com.mobileclient.service:业务逻辑层,通过和服务器通信,实现数据的发送和接收。 com.mobileclient.handler:当服务器返回xml数据集时,需要调用这个层的类实现xml数据集到java对象数据链表的转换,这里采用的是SAX解析技术,相比DOM技术解析需要更低内存,很适合手机上使用。 com.mobileclient.util:里面包括各种Adapter主要负责将各种数据渲染显示到界面上,这里还有个ImageService负责从服务器获取图片资源,HttpUtil负责和服务器通信,主要是发送参数给服务器! com.mobileclient.app:保存应用程序类,全局变量可以放到这里,应用程序中未处理的异常可以在此被捕获到日志文件。 res/layout:各种界面布局文件! res/drawable-mdpi:程序界面中用到的图片资源文件
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值