Android Camera NDK的使用

1.简介

         上一篇讲了Android Camera获取预览数据流的过程,既然拿到了,总不能就这样算了吧,本来打算直接讲数据格式转换的,但是我们知道java的效率还是很低的,很多转换的操作也都是将c++的代码直接用java写一遍,这样可想而知,算法耗时在视频操作中是很敏感的,所以这章讲述一下怎么在Android项目中,使用C++的代码,也就是标题写的NDK,当然也有人喜欢叫JNI,其实两者还是有差别的,两者的关系可以这样理解NDK是基于JNI开发,就好像Android 基于java开发一样。

2.项目创建

首先,需要先配置一下NDK,打开Sdk Tool勾选NDK,当然也可以直接在网上下载NDK的包,手动配置

然后再配置一下NDK的路径,默认因该是配置好的,之后就可以创建NDK项目了

创建项目的时候勾选Include C++就好了,对,就是这么简单。

3.使用解析

1.创建完成之后,看文件的目录,可以看到,比起以前的项目,多了一个cpp文件夹。这个就是用来存放C文件的目录。后续也会在这里面开发。

2.CmekeList.text文件,文件在app目录下面,这个很重要,是编译用的配置文件,只有写好了这个配置文件我们才正确编译出我们想要的动态库,具体使用,还是百度一下吧,这儿就不具体介绍了。

3.再看看MainActivity中,也有了变化,首先是多了一个

这个是用来装载库文件,不知道大家有时候使用第三方SDK的时候,有没有发现,他们会叫你将 某某.so文件拷贝到jniLibs目录下,每错,这个native-lib就是相当于那个某某.so,最终程序编译的时候,会将native-lib.cpp编译成so库,供程序使用。

然后就是

这是编译器为我们生成的hello world,native也就是JNI方法的关键字,点进去,看看里面

这就是JNI方法了,命名通过包名加类名,加方法名,有时候提示找不到方法,很有可能就是你的包名填错了。至于JNI的用法,可以参考一下百度。了解一些基本的,就可以开始创建自己的NDK项目了。

给个小技巧,可以现在activity中定义一个native方法,然后alt + enter 就自动生成对应的方法了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Android NDK Camera 开发时,可以通过调用 Camera.Parameters 的 setExposureCompensation(int) 方法来关闭曝光控制。具体实现代码如下: ``` #include <android/native_window_jni.h> #include <android/native_window.h> #include <android/log.h> #include <android/bitmap.h> #include <jni.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #include <math.h> #include <pthread.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/ioctl.h> #include <linux/videodev2.h> #define LOG_TAG "NDKCamera" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) extern "C" { JNIEXPORT void JNICALL Java_com_example_ndkcamera_CameraActivity_setExposureCompensation(JNIEnv* env, jobject obj, jint value); }; void Java_com_example_ndkcamera_CameraActivity_setExposureCompensation(JNIEnv* env, jobject obj, jint value) { jclass cameraClass = env->FindClass("android/hardware/Camera"); jmethodID openMethodID = env->GetStaticMethodID(cameraClass, "open", "(I)Landroid/hardware/Camera;"); jobject cameraObject = env->CallStaticObjectMethod(cameraClass, openMethodID, 0); jmethodID getParametersMethodID = env->GetMethodID(cameraClass, "getParameters", "()Landroid/hardware/Camera$Parameters;"); jobject parametersObject = env->CallObjectMethod(cameraObject, getParametersMethodID); jclass parametersClass = env->FindClass("android/hardware/Camera$Parameters"); jmethodID setExposureCompensationMethodID = env->GetMethodID(parametersClass, "setExposureCompensation", "(I)V"); env->CallVoidMethod(parametersObject, setExposureCompensationMethodID, value); jmethodID setParametersMethodID = env->GetMethodID(cameraClass, "setParameters", "(Landroid/hardware/Camera$Parameters;)V"); env->CallVoidMethod(cameraObject, setParametersMethodID, parametersObject); } ``` 以上代码中,我们通过调用 setExposureCompensation(int) 方法,将曝光补偿值设置为 0,来关闭曝光控制。具体实现中,我们使用JNI(Java Native Interface)来将 Java 代码与 C++ 代码连接起来。 在 Java 代码中,我们可以像下面这样调用 C++ 函数来关闭曝光控制: ``` setExposureCompensation(0); ``` 注意,这里的参数值为 0,表示关闭曝光控制。如果需要开启曝光控制,可以将参数值设置为一个正整数,表示曝光补偿值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值