在Android系统中添加JAVA API

来源:互联网 发布:mysql 5.0.45中文版 编辑:程序博客网 时间:2024/05/17 02:15
How to: 在Android系统中添加JAVA API本文的主要目的是:为native代码添加相应的java api代码添加相应的java api第一步:编写Java API类,请注意使用<>括起的注释内容<添加文件头信息:>/*************************************************************************************************** *  FileName    : NativeVideoConfig.java *  Copyright   : Beijing Cycle Century Digital Technology Co.Ltd. 2003 (c) *  Description : dd native api for video config *-------------------------------------------------------------------------------------------------- *  History     : *  <time>        <version >   <author>   <desc> *  2012-8-23     V1.0.0       zhaoyh      first release. *************************************************************************************************** */package android.ccdt.dd;//<命名规则:android.ccdt为统一包开头,随后为所封装的模块名public class NativeVideoConfig {    //<编写native方法封装>  // ------------------------- for native code --------------------------  static {    System.loadLibrary("dd_jni"); //<加载libdd_jni.so,命名规则为:调用的底层库,加后缀_jni为jni封装库的名字>  }       private static native int set_video_format(int videoformat); //<native方法均为private,禁止java层直接访问,方便今后的代码修改维护>  private static native int get_video_format();  private static native int adjust_video_offset(int xoff, int yoff, int width, int height);  private static native int set_display_brightness(int brightness);  private static native int set_display_proportion(int proportion);  //----------------------------------------------------------------------  //<编写该类的公有接口封装>  public static enum Proportion{ //<int 类型的数据,都应该用枚举进行一次封装,方便接口的使用,以及代码可读性>    PROPORTION_E4X3(0),    PROPORTION_E16X9(1);            private final int value;    private Proportion(int val) {      value = val;    }    public int getValue() {      return value;    }    public static Proportion getEnum(int val) {      for (Proportion e : Proportion.values()) {        if (e.getValue() == val) {           return e;        }      }      return null;    }  }  public static VideoFormat getVideoFormat(){//<公有接口封装>     return VideoFormat.getEnum(get_video_format());//<int类型装枚举类型>  }  public static int setVideoProportion(Proportion proportion){ //<公有接口封装>    return set_video_proportion(proportion.getValue());//<枚举类型转int>  }}第二步:编写Android.mk,编译并生成jar包include $(CLEAR_VARS)LOCAL_SRC_FILES := \           $(call all-subdir-java-files) \LOCAL_MODULE:= android.ccdt.ddLOCAL_MODULE_TAGS := enginclude $(BUILD_JAVA_LIBRARY)第三步:使用javah生成java文件对应的C++的.h头文件由于javah只能对.class文件进行进行处理,而编译出来的文件被打成了jar包,因此,首先需要进行解包。对于LOCAL_MODULE:= ccdt_dd的文件,编译生成的jar包位置为:$(AndroidRoot)/out/target/common/obj/JAVA_LIBRARIES/android.ccdt.dd_intermediates/classes.jar对jar包解压的命令为:cd $(AndroidRoot)/out/target/common/obj/JAVA_LIBRARIES/android.ccdt.dd_intermediates/jar xvf classes.jar使用javah生成头文件javah -classpath $(AndroidRoot)/out/target/common/obj/JAVA_LIBRARIES/android.ccdt.dd_intermediates/ -jni android.ccdt.dd.NativeDisplayConfig第四步:编写api的native实现,编写方法请参照JNI相关规范编写,这里主要描述如何利用现有代码框架,减少编写工作量在头文件中添加注册函数int register_android_ccdt_dd_NativeDisplayConfig(JNIEnv *env);根据头文件中的注释说明,在cpp文件中实现该注册函数/* * Class:     android_ccdt_dd_NativeDisplayConfig * Method:    set_video_proportion * Signature: (I)I */JNIEXPORT jint JNICALL Java_android_ccdt_dd_NativeDisplayConfig_set_1video_1proportion (JNIEnv *, jclass, jint);static const char* const kClassPathName = "android/ccdt/dd/NativeDisplayConfig";//<java类的包名/类名>static JNINativeMethod gMethods[] = {   { "set_video_format", "(I)I", (void*) Java_android_ccdt_dd_NativeDisplayConfig_set_1video_1format },//<拷贝自头文件的说明>   { "get_video_format", "(I)I", (void*) Java_android_ccdt_dd_NativeDisplayConfig_get_1video_1format },   { "adjust_video_offset", "(IIII)I", (void*) Java_android_ccdt_dd_NativeDisplayConfig_adjust_1video_1offset },   { "set_display_brightness", "(I)I", (void*) Java_android_ccdt_dd_NativeDisplayConfig_set_1display_1brightness },   { "set_video_proportion", "(I)I", (void*) Java_android_ccdt_dd_NativeDisplayConfig_set_1video_1proportion },};int register_android_ccdt_dd_NativeDisplayConfig(JNIEnv *env) {   return AndroidRuntime::registerNativeMethods(env, kClassPathName,           gMethods, NELEM(gMethods));}在JNILoader.cpp中调用注册方法#include "android_ccdt_dd_NativeDisplayConfig.h"static int registerNatives(JNIEnv* env) {   if (register_android_ccdt_dd_NativeDisplayConfig(env) < 0) {       LOGE("ERROR: NativeDisplayConfig native registration failed\n");       return JNI_FALSE;   }   return JNI_TRUE;}第五步:编写Android.mk文件include $(CLEAR_VARS)LOCAL_MODULE:= libdd_jniLOCAL_MODULE_TAGS := engLOCAL_PRELINK_MODULE := falseLOCAL_SRC_FILES:= \   JniLoader.cpp \   android_ccdt_dd_NativeDisplayConfig.cpp \ #<添加需要编译的模块>LOCAL_SHARED_LIBRARIES := \ #<链接所需的动态库>   libandroid_runtime \   libnativehelper \   libutils \   libbinder \LOCAL_C_INCLUDES += \ #<包含所需的头文件>   $(TOP)/frameworks/base/core/jni \   $(TOP)/frameworks/base/include/binder \include $(BUILD_SHARED_LIBRARY)第六步:添加权限控制xml文件名称:android.ccdt.dd.xml 内容:<?xml version="1.0" encoding="utf-8"?><permissions>   <library name="android.ccdt.dd"           file="/system/framework/android.ccdt.dd.jar"/></permissions>在产品的makefile中添加对该文件的拷贝:PRODUCT_COPY_FILES += \   vendor/broadcom/bcm${BCHP_CHIP}/framework/java/android.ccdt.dd.xml:system/etc/permissions/android.ccdt.dd.xml第七步:应用程序使用该库在应用程序的AndroidManifest.xml中进行定义:<application>  <uses-library android:name="android.ccdt.dd" />  ...  <activity /></application>

原创粉丝点击