NDK开发入门(三)

1 C++与Java的映射方案

  在Java层调用native方法时,native方法不是具体的,需要去C++层去寻找对应的真正实现。在JNI的文档中,提到其实现方案类似于实现C++继承机制的虚函数表,有兴趣的同学可以去看一下。本小节主要讲解映射规则,demo戳此

1.1 静态注册

  上篇文章已经提及,函数名主要是Java_包名_类名_方法名这样的书写方式。相应的对应数据类型的表格如下。

  1. 基本数据类型如下,除void外,一般的native类型都是在java类型前面加j。
    在这里插入图片描述
  2. 引用数据类型如下,数组的JNI层数据类型需要以“Array”结尾,签名格式的开头都会有“[”。除了数组以外,其他的引用数据类型的签名格式都会以“;”结尾。 在这里插入图片描述
      另外引用类型之间还有相应的继承关系。
    在这里插入图片描述

1.2 动态注册

  动态注册需要三个步骤

  1. On_load注册函数。
  2. 填写注册信息。
  3. 自定义的函数名
//
// Created by Administrator on 2019-05-05.
//
#include "com_chinaso_addnative_Register.h"
jstring  Java_com_chinaso_addnative_Register_staticRegister
        (JNIEnv *jniEnv, jclass ){
    return jniEnv->NewStringUTF("static Register");
}
/**
 * 可以自己随便命名的本地方法,只需要在对应的数据结构中注册
 * @param env
 * @param jobj
 * @return
 */
jstring dynamic_register(JNIEnv *env,jobject jobj){
    char* str = "dynamic register";
    return env->NewStringUTF(str);
}
/**
 *c++ 函数名与JAVA函数名的映射表{Java中的函数名,(函数参数表)返回值签名,C++中的函数名}
 * 其中参数表返回值签名是为了重载同名函数能够有所区分
 *
 *  JNINativeMethod 结构体的数组是固有的。
 * 结构体参数1:对应java类总的native方法
 * 结构体参数2:函数签名
 * 结构体参数3:c/c++ 种对应的方法名
 */
static JNINativeMethod gMethods[] = {
        {"dynamicRegister","()Ljava/lang/String;",(void *)dynamic_register }
};

JNIEXPORT int JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
    JNIEnv *env = NULL;
    jint result = JNI_FALSE;
    if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
        return result;
    }
    if (env == NULL) {
        return result;
    }
    jclass clazz = env->FindClass("com/chinaso/addnative/Register");
    if (clazz == NULL) {
        return result;
    }
    if(env->RegisterNatives(clazz, gMethods, sizeof(gMethods)/ sizeof(gMethods[0]))<0) {
        return result;
    }
    result = JNI_VERSION_1_6;
    return result;
}

1.3 头文件的生成方法

  1. 用javac命令生成对应的.class文件。由于使用Android Studio 内置的terminal,所以默认目录是项目根目录。注释是命令是使用方法。
javac  app/src/main/java/com/chinaso/addnative/Register.java  //javac your_class_path/class_name.java
  1. 根据第一步创建的javah命令生成相应的头文件,首先看一下这个命令的用法吧。在这里插入图片描述
  2. 为了更清楚的描述,上一下目录结构吧。

在这里插入图片描述
AS的Terminal默认是工程根目录。-classpath 是从中加载类路径,这个位置就是你生成.class文件的位置。-d就是输出的头文件被放到哪里。-jni就是输出符合JNI标准的头文件。另外在javah的用法说明里,在最后说明了这个类需要加全限定名,也就是包名+类名。

javah -classpath ./app/src/main/java  -d ./app/src/main/cpp  -jni  com.chinaso.addnative.Register
  1. 生成了静态注册所需要的方法名以及动态注册需要的方法签名。事实上这一步骤在动态注册或者静态注册中是可以省略的,只是提供了一种自动生成而非手动书写的办法而已。在这里插入图片描述

2 参考文献

[1]https://blog.csdn.net/itachi85/article/details/74157262

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值