Android 添加JNI文件到源码流程

1:添加cpp文件到\frameworks\base\core\jni  

    对应目录下的Android.mk中添加编译目标

     LOCAL_SRC_FILES:= \ 标签下

     LOCAL_SHARED_LIBRARIES := \ 标签下


     对应目录下的AndroidRuntime.cpp文件中注册cpp文件

    如extern int register_android_hardware_SerialPort(JNIEnv *env);

        REG_JNI(register_android_hardware_SerialPort),


   cpp文件中要添加注册函数,不然Java的本地调用找不到

namespace android
{

........

  

static JNINativeMethod method_table[] = {
    {"native_open",             "(Ljava/io/FileDescriptor;I)V",
                                        (void *)android_hardware_SerialPort_open},
    {"native_close",            "()V",  (void *)android_hardware_SerialPort_close},
    {"native_read_array",       "([BI)I",
                                        (void *)android_hardware_SerialPort_read_array},
    {"native_read_direct",      "(Ljava/nio/ByteBuffer;I)I",
                                        (void *)android_hardware_SerialPort_read_direct},
    {"native_write_array",      "([BI)V",
                                        (void *)android_hardware_SerialPort_write_array},
    {"native_write_direct",     "(Ljava/nio/ByteBuffer;I)V",
                                        (void *)android_hardware_SerialPort_write_direct},
    {"native_send_break",       "()V",  (void *)android_hardware_SerialPort_send_break},
};


int register_android_hardware_SerialPort(JNIEnv *env)
{
    jclass clazz = env->FindClass("android/hardware/SerialPort");
    if (clazz == NULL) {
        ALOGE("Can't find android/hardware/SerialPort");
        return -1;
    }
    field_context = env->GetFieldID(clazz, "mNativeContext", "I");
    if (field_context == NULL) {
        ALOGE("Can't find SerialPort.mNativeContext");
        return -1;
    }


    return AndroidRuntime::registerNativeMethods(env, "android/hardware/SerialPort",
            method_table, NELEM(method_table));
}

    }

  2:或者添加cpp文件到\frameworks\base\services\jni    

        

     对应目录下的Android.mk中添加编译目标

       LOCAL_SRC_FILES:= \ 标签下

       LOCAL_SHARED_LIBRARIES := \ 标签下


        对应目录下onload.cpp文件中注册cpp文件

        此目录下的JNI文件主要是用来注册系统服务时使用的的如上一张讲到的需要调用本地方法时使用。

 如:int register_android_server_SerialService(JNIEnv* env);

        register_android_server_SerialService(env);


 cpp文件中要添加注册函数,不然java的本地调用找不到  

namespace android
{

........

 static JNINativeMethod method_table[] = {
    { "native_open",                "(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;",
                                    (void*)android_server_SerialService_open },
};

int register_android_server_SerialService(JNIEnv *env)
{
    jclass clazz = env->FindClass("com/android/server/SerialService");
    if (clazz == NULL) {
        ALOGE("Can't find com/android/server/SerialService");
        return -1;
    }

    clazz = env->FindClass("android/os/ParcelFileDescriptor");
    LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.ParcelFileDescriptor");
    gParcelFileDescriptorOffsets.mClass = (jclass) env->NewGlobalRef(clazz);
    gParcelFileDescriptorOffsets.mConstructor = env->GetMethodID(clazz, "<init>", "(Ljava/io/FileDescriptor;)V");
    LOG_FATAL_IF(gParcelFileDescriptorOffsets.mConstructor == NULL,
                 "Unable to find constructor for android.os.ParcelFileDescriptor");

    return jniRegisterNativeMethods(env, "com/android/server/SerialService",
            method_table, NELEM(method_table));
}

   }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值