工具:Android本地代码生成器

介绍了一款用于简化Android NDK开发流程的小工具,它能自动生成本地方法对应的C/C++文件和编译配置文件,同时更新Java文件以加载本地库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<style type="text/css"> <!-- @page {margin:0.79in} p {margin-bottom:0.08in} pre.cjk {font-family:"WenQuanYi Zen Hei",monospace} --> </style>

在使用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.mkHelloJniActivity.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写的,更好的选择应该是用脚本来写,如PerlPython。还有就是,如果能把这个工具集成到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:程序界面中用到的图片资源文件!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值