美文网首页
Android | 通过JNI对比时间并抛异常

Android | 通过JNI对比时间并抛异常

作者: l王小一 | 来源:发表于2018-11-12 11:02 被阅读0次

背景:

android一个视频播放项目用到的库使用c/c++写的,通过JNI与java交互,
然后在as中达到运行. 要在视频初始化时去做一个时间对比 (提示是否过期,
过期后不可进行初始化便不能使用). 要在源码库当中去修改, 便用到了在as中
通过JNI让c/c++和java进行交互.因为不会c语言, 也是问了同事还有百度
经过反复调试实现了一个demo. 特此记录一下.

as中新建测试项目,并勾选

1.png

本地一定要下载CMake支持

2.png

建好的项目就会自动生成c/c++的代码文件

3.png

贴上.cpp文件代码

#include <jni.h>
#include <string>
#include <stdlib.h>
#include <android/log.h>


#define TAG    "myhello-jni-test" // 这个是自定义的LOG的标识
#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__) // 定义LOGD类型



extern "C"
JNIEXPORT jstring

JNICALL
Java_test_yoyo_com_test_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

int standard_to_stamp(const char *str_time)
{
        struct tm stm;
        int iY, iM, iD, iH, iMin, iS;

        memset(&stm,0,sizeof(stm));
        iY = atoi(str_time);
        iM = atoi(str_time+5);
        iD = atoi(str_time+8);
        iH = atoi(str_time+11);
        iMin = atoi(str_time+14);
        iS = atoi(str_time+17);

        stm.tm_year=iY-1900;
        stm.tm_mon=iM-1;
        stm.tm_mday=iD;
        stm.tm_hour=iH;
        stm.tm_min=iMin;
        stm.tm_sec=iS;

     /*printf("%d-%0d-%0d %0d:%0d:%0d\n", iY, iM, iD, iH, iMin, iS);*/
    //标准时间格式例如:2016:08:02 12:12:30
    return (int)mktime(&stm);
}

extern "C"
JNIEXPORT jboolean JNICALL
Java_test_yoyo_com_test_MainActivity_comperTime(JNIEnv *env, jobject instance, jstring time_) {
    const char *char_time = env->GetStringUTFChars(time_, 0);
    int t = standard_to_stamp(char_time);

    time_t now;
    int unixTime = (int)time(&now);

    LOGD("nowTIME %d",unixTime);
    LOGD("cTIME %d",t);

    if (t > unixTime){
        LOGD("result %d",1);
        return true;
    }else{
        LOGD("result %d",2);
        return false;
    }


    // TODO

    env->ReleaseStringUTFChars(time_, char_time);


}

MainActivity中的调用方法

4.png

运行后打印的log

5.png

获取系统当前时间和固定的时间, 将两个时间以时间戳的形式进行对比.

JNI中的打印规范
%d,用来输出十进制整数
%f,用来输出实数(包括单,双精度),以小数形式输出
%c,用来输出一个字符
%s,用来输出一个字符串

时间对比已经完成了,那在项目中调用库中方法时如何去获取结果呢?
因为我要做的事时间过期的一个需求, 所以在判断时间不符合后就抛个异常
出去, 然后项目中调用时通过 try catch捕获异常进行相应的提示

JNI中的抛异常当然是和JAVA中不一样的

6.png

要在上面代码所在的方法后加

7.png

这样在调用该方法时可直接捕获异常并进行弹框提示异常信息

8.png

至此,相关处理全部结束.

结尾碎碎念: 以前没有接触过C语言,只是简单了解过C中有指针指向的一个概念.
这次接触的也不多,光用到的获取时间和转换这里觉得很麻烦.需要学的还很多,
继续努力吧.

相关文章

网友评论

      本文标题:Android | 通过JNI对比时间并抛异常

      本文链接:https://www.haomeiwen.com/subject/pauqfqtx.html