基于Android本地代码生成器详解

 更新时间:2013年05月23日 09:14:07   作者:  
本篇文章是对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实现静音检测功能

    Android实现静音检测功能

    这篇文章主要为大家详细介绍了Android实现静音检测功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 详解Android的网络数据存储

    详解Android的网络数据存储

    LeanCloud是一种简单高效的数据和文件存储服务,本文主要介绍了利用LeanCloud来进行网络数据的存储的实现方法。具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • Android仿微信QQ聊天顶起输入法不顶起标题栏的问题

    Android仿微信QQ聊天顶起输入法不顶起标题栏的问题

    这篇文章主要介绍了Android之仿微信QQ聊天顶起输入法不顶起标题栏问题,本文实例图文相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Windows下获取Android 源码方法的详解

    Windows下获取Android 源码方法的详解

    本篇文章是对在Windows下获取Android 源码的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Android基于开源项目xutils3实现下载

    Android基于开源项目xutils3实现下载

    这篇文章主要介绍了Android基于开源项目xutils3实现下载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Android利用Hero实现列表与详情页无缝切换动画

    Android利用Hero实现列表与详情页无缝切换动画

    本文我们将利用Hero动画实现一个简单案例:实现列表与详情页无缝切换动画,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
    2022-06-06
  • Android搭建grpc环境过程分步详解

    Android搭建grpc环境过程分步详解

    本篇文章使用的IDE是Android Studio。这里先吐槽一句,安卓项目搭建grpc环境,不管是引入插件还是引入第三方库,对于版本的要求都极为苛刻,一旦版本不匹配就会报错,所以对于版本的搭配一定要注意
    2023-04-04
  • Android编程中光线传感器的调用方法详解

    Android编程中光线传感器的调用方法详解

    这篇文章主要介绍了Android编程中光线传感器的调用方法,结合实例形式分析了Android光线传感器的调用方法、函数、属性相关使用技巧,需要的朋友可以参考下
    2017-08-08
  • Android实现录音监听动画的示例代码

    Android实现录音监听动画的示例代码

    在很多app种内置了语音助手,也存在各种动画,这篇文章主要为大家详细介绍了Android实现录音监听动画的示例代码,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • Android编程实现调用系统分享功能示例

    Android编程实现调用系统分享功能示例

    这篇文章主要介绍了Android编程实现调用系统分享功能,结合实例形式分析了Android实现针对文字、图片等元素分享功能的相关操作技巧,需要的朋友可以参考下
    2017-01-01

最新评论