背景:
android一个视频播放项目用到的库使用c/c++写的,通过JNI与java交互,
然后在as中达到运行. 要在视频初始化时去做一个时间对比 (提示是否过期,
过期后不可进行初始化便不能使用). 要在源码库当中去修改, 便用到了在as中
通过JNI让c/c++和java进行交互.因为不会c语言, 也是问了同事还有百度
经过反复调试实现了一个demo. 特此记录一下.
as中新建测试项目,并勾选
![](https://img.haomeiwen.com/i13005066/aa7c488af34b0e3b.png)
本地一定要下载CMake支持
![](https://img.haomeiwen.com/i13005066/fbf0478a11974c65.png)
建好的项目就会自动生成c/c++的代码文件
![](https://img.haomeiwen.com/i13005066/b5a38e2532afe975.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中的调用方法
![](https://img.haomeiwen.com/i13005066/92475aa6f776ec5f.png)
运行后打印的log
![](https://img.haomeiwen.com/i13005066/730cb66012e0fda2.png)
获取系统当前时间和固定的时间, 将两个时间以时间戳的形式进行对比.
JNI中的打印规范
%d,用来输出十进制整数
%f,用来输出实数(包括单,双精度),以小数形式输出
%c,用来输出一个字符
%s,用来输出一个字符串
时间对比已经完成了,那在项目中调用库中方法时如何去获取结果呢?
因为我要做的事时间过期的一个需求, 所以在判断时间不符合后就抛个异常
出去, 然后项目中调用时通过 try catch捕获异常进行相应的提示
JNI中的抛异常当然是和JAVA中不一样的
![](https://img.haomeiwen.com/i13005066/49387922149fb3a7.png)
要在上面代码所在的方法后加
![](https://img.haomeiwen.com/i13005066/d750c9a69cc2d96a.png)
这样在调用该方法时可直接捕获异常并进行弹框提示异常信息
![](https://img.haomeiwen.com/i13005066/5db198a720886f3a.png)
至此,相关处理全部结束.
结尾碎碎念: 以前没有接触过C语言,只是简单了解过C中有指针指向的一个概念.
这次接触的也不多,光用到的获取时间和转换这里觉得很麻烦.需要学的还很多,
继续努力吧.
网友评论