工具:Android本地代码生成器

原创 2011年10月19日 23:04:41

在使用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程序里访问本地HTML

在开发Android应用的时候,有可能会访问网页,功能很简单。代码如下:
  • HOOLOO
  • HOOLOO
  • 2014-08-07 23:16:10
  • 12741

通过Html网页调用本地安卓app程序代码

前段时间写一些移动端的项目,正好项目中遇到与native交互的需求,特此将其整理下来:一. 通过html页面打开Android本地的app 首先在编写一个简单的html页面 ...
  • weixin_38194357
  • weixin_38194357
  • 2017-04-05 17:45:02
  • 709

android屏幕适配dimens文件及dimens文件生成器

  • 2017年06月10日 14:59
  • 664KB
  • 下载

Android本地代码生成器

  • 2011年10月19日 23:17
  • 10KB
  • 下载

安卓漫漫路之读取本地html文件.

为什么放置到assets文件夹下:     Android资源文件大致可以分为两种:     第一种是res目录下存放的可编译的资源文件:     这种资源文件系统会在R.java里面自动生成该资...
  • HighForehead
  • HighForehead
  • 2017-01-05 23:28:42
  • 3347

简洁的通用<em>安卓本地</em>电子书项目Android应用源码

评论共有6条 FNDXTZ 2017-09-02 11:29:08 太垃圾了,什么东西都往上传,...Android 电子书应用完全开源<em>代码</em> android<em>安卓本地</em>电子书毕设源码 立即下载 上传...
  • 2018年04月17日 00:00

安卓代码生成器的使用

总体介绍:https://my.oschina.net/zhengxiaohui/blog?catalog=5601579&temp=1487294342928 框架代码链接:https://git...
  • feidaobang43
  • feidaobang43
  • 2017-02-17 09:22:03
  • 724

dimens文件生成器

问题来源:自己做了一个应用,UI发过来交互文档中的尺寸单位都是px,而google推荐dp,同时为了适配不同屏幕,需要从新计算,为了减少重复性工作,该脚本孕育而生。 实现方案:就是dimens.xm...
  • DAo_1990
  • DAo_1990
  • 2017-11-15 09:43:20
  • 912

如何为Android缓存数据到本地

如何为Android缓存数据到本地对于一个应用来说,有许多的数据是不需要实时访问网络的,或者在用户第二次打开应用的时候 ,访问网络可能不是特别的快 ,但是此时的应用是没有数据展示的,这时候就会涉及到 ...
  • FussenYu
  • FussenYu
  • 2016-04-26 18:47:50
  • 5014

android中读取<em>本地</em>文件demo

本demo实现了读取<em>本地</em>SD卡中的文件,word或者pdf,显示成一个listview中,可以打开浏览weord内容,可以进行搜索,搜索想要看的文件。
  • 2018年04月17日 00:00
收藏助手
不良信息举报
您举报文章:工具:Android本地代码生成器
举报原因:
原因补充:

(最多只允许输入30个字)