当前位置: 首页 > news >正文

云南微网站开发最专业的做网站公司哪家好

云南微网站开发,最专业的做网站公司哪家好,桂林尚品网络科技有限公司,dw网页设计图片轮播切换1. 前言 最基础的创建JNI接口的操作#xff0c;可以直接看这篇文章 : 第一个Android JNI工程#xff0c; 本文会基于掌握创建JNI接口的操作的基础之上#xff0c;来入门JNI/NDK。 2. 在JNI中打印日志 2.1 添加log模块 记得CMake中有log模块#xff0c;不然编译不过 ta…1. 前言 最基础的创建JNI接口的操作可以直接看这篇文章 : 第一个Android JNI工程 本文会基于掌握创建JNI接口的操作的基础之上来入门JNI/NDK。 2. 在JNI中打印日志 2.1 添加log模块 记得CMake中有log模块不然编译不过 target_link_libraries(#...省略androidlog)2.2 添加头文件 #include android/log.h2.3 定义Log方法 #define LOG_TAG CPPLOG #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG , __VA_ARGS__) // 定义LOGD类型 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG , __VA_ARGS__) // 定义LOGE类型 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG , __VA_ARGS__) // 定义LOGE类型2.4 进行调用 LOGD(java int value is %p, value);3. 基础类型转换 JNI和Java基础类型可以直接进行转换 在jni.h中我们可以看到JNI的基础类型有这些比如jint其实就是对应C中的int32_t类型 /* Primitive types that match up with Java equivalents. */ typedef uint8_t jboolean; /* unsigned 8 bits */ typedef int8_t jbyte; /* signed 8 bits */ typedef uint16_t jchar; /* unsigned 16 bits */ typedef int16_t jshort; /* signed 16 bits */ typedef int32_t jint; /* signed 32 bits */ typedef int64_t jlong; /* signed 64 bits */ typedef float jfloat; /* 32-bit IEEE 754 */ typedef double jdouble; /* 64-bit IEEE 754 */在C中_t是一种命名约定表示某个类型。通常在命名中使用_t作为类型的后缀以便区分该名称是一个类型而不是其他实体例如变量或函数。 我把它整理成了一个表格Java基础类型和JNI基础类型相对应 JavaNativebooleanjbooleanbytejbytecharjcharshortjshortintjintlongjlongfloatjfloatdoublejdouble 3.1 编写JNI方法 在Java类中编写JNI方法 external fun callNativeInt(value:Int) : Intexternal fun callNativeByte(value:Byte) : Byteexternal fun callNativeChar(value:Char) : Charexternal fun callNativeLong(value:Long) : Longexternal fun callNativeFloat(value:Float) : Floatexternal fun callNativeDouble(value:Double) : Double3.2 C中编写对应的方法 extern C JNIEXPORT jint JNICALL Java_com_heiko_myopencvtest2023_NativeLib_callNativeInt(JNIEnv *env, jobject thiz, jint value) {LOGD(value:%d, value);return value 1; } extern C JNIEXPORT jbyte JNICALL Java_com_heiko_myopencvtest2023_NativeLib_callNativeByte(JNIEnv *env, jobject thiz, jbyte value) {LOGD(value:%d, value);return value 1; } extern C JNIEXPORT jchar JNICALL Java_com_heiko_myopencvtest2023_NativeLib_callNativeChar(JNIEnv *env, jobject thiz, jchar value) {LOGD(value:%d, value);return value 1; } extern C JNIEXPORT jlong JNICALL Java_com_heiko_myopencvtest2023_NativeLib_callNativeLong(JNIEnv *env, jobject thiz, jlong value) {LOGD(value:%d, value);return value 1; } extern C JNIEXPORT jfloat JNICALL Java_com_heiko_myopencvtest2023_NativeLib_callNativeFloat(JNIEnv *env, jobject thiz, jfloat value) {LOGD(value:%f, value);return value 1.0; } extern C JNIEXPORT jdouble JNICALL Java_com_heiko_myopencvtest2023_NativeLib_callNativeDouble(JNIEnv *env, jobject thiz,jdouble value) {LOGD(value:%f, value);return value 1.0; }3.3. 进行调用 Log.i(TAG, result:${nativeLib.callNativeInt(1)}) Log.i(TAG, result:${nativeLib.callNativeByte(2)}) Log.i(TAG, result:${nativeLib.callNativeChar(c)}) Log.i(TAG, result:${nativeLib.callNativeLong(4)}) Log.i(TAG, result:${nativeLib.callNativeFloat(5F)}) Log.i(TAG, result:${nativeLib.callNativeDouble(6.0)})3.4 运行项目 打印日志如下 10:16:36.815 D value:1 10:16:36.815 I result:2 10:16:36.815 D value:2 10:16:36.815 I result:3 10:16:36.815 D value:99 10:16:36.815 I result:d 10:16:36.815 D value:4 10:16:36.815 I result:5 10:16:36.815 D value:5.000000 10:16:36.815 I result:6.0 10:16:36.816 D value:6.000000 10:16:36.816 I result:7.04. 字符串 Java字符串转成Native的字符串并不能直接做转换需要调用env-GetStringUTFChars() 对应的需要调用env-ReleaseStringUTFChars()来释放资源。 默认情况下Java都是UTF编码如果不是UTF编码则需要调用env-GetStringChars() 4.1 Java/Native字符串转换 external fun callNativeString(value:String) : Stringextern C JNIEXPORT jstring JNICALL Java_com_heiko_myopencvtest2023_NativeLib_callNativeString(JNIEnv *env, jobject thiz,jstring value) {//Java字符串转成Native的字符串并不能直接做转换const char *str env-GetStringUTFChars(value, NULL); //Java的字符串是UTF编码的//env-GetStringChars(); //如果不是UTF编码就用这个LOGD(str:%s, str);env-ReleaseStringUTFChars(value, str);jstring result env-NewStringUTF(hello world!);return result; }进行调用 Log.i(TAG, result:${nativeLib.callNativeString(你好呀)}) nativeLib.stringMethod(hello world!)执行结果 10:45:45.849 D str:你好呀 10:45:45.849 I result:hello world!4.2 C 字符串的使用 定义JNI接口 external fun stringMethod(value:String)实现C方法 extern C JNIEXPORT void JNICALL Java_com_heiko_myopencvtest2023_NativeLib_stringMethod(JNIEnv *env, jobject thiz, jstring value) {const char *str env-GetStringUTFChars(value, 0);int length env-GetStringLength(value);LOGD(length:%d, length);char buf[256];env-GetStringUTFRegion(value, 0, length, buf); //拷贝字符串数据到char[]中LOGD(text:%s, buf);env-ReleaseStringUTFChars(value, str); }进行调用 Log.i(TAG, result:${nativeLib.callNativeString(你好呀)}) nativeLib.stringMethod(hello world!)执行结果 10:45:45.849 D length:12 10:45:45.849 D text:hello world!5. 引用类型的使用 这里列出了Java引用类型和JNI应用类型的对应关系。 值得注意的是不是所有的Java引用类型都有对应的JNI的引用类型。 比如Java中的字符串数组String[]就没有相对应的JNI的引用类型这种情况下都会统一归类为jobject。 Java ReferenceNativeAll objectsjobjectjava.lang.Classjclassjava.lang.StringjstringObject[]jobjectArrayboolean[]jbooleanArraybyte[]jbyteArrayjava.lang.Throwablejthrowablechar[]jcharArrayshort[]jshortArrayint[]jintArraylong[]jlongArrayfloat[]jfloatArraydouble[]jdoubleArray 5.1 传递字符串数据 Java层传递一个字符串数组然后C层接收到后获取这个字符串数组的第一个字符串并打印出来。 定义JNI接口 external fun callNativeStringArray(array:ArrayString)实现C方法这里因为是字符串数组JNI中没有相对应的类型所以需要先通过env-GetObjectArrayElement()获取到Object数组中的第一个索引的Object再将其强转为jstring类型。 如果是JNI有对应类型的按直接调用相关API就可以了比如env-GetIntArrayElements()、env-GetFloatArrayElements() extern C JNIEXPORT void JNICALL Java_com_heiko_myopencvtest2023_NativeLib_callNativeStringArray(JNIEnv *env, jobject thiz,jobjectArray array) {int len env-GetArrayLength(array);LOGD(len:%d,len);//env-GetIntArrayElements() //获取Int数组//env-GetFloatArrayElements() //获得Float数组//env-GetObjectArrayElement() //获得JNI数组jstring result static_castjstring(env-GetObjectArrayElement(array, 0)); //获取index为0的值const char * str env-GetStringUTFChars(result,NULL);LOGD(text[0]:%s,str);env-ReleaseStringUTFChars(result,str); }static_cast是进行类型的强转 进行调用 val array arrayOf(ABC, DEF, GHI, JKL, MNO) nativeLib.callNativeStringArray(array)执行结果 13:27:06.865 D len:5 13:27:06.865 D text[0]:ABC6. 传递Bitmap 这里我们以镜像Bitmap图片为例传递Bitmap图片到JNI层然后进行镜像操作并将镜像后的Bitmap图片返回给Java层 6.1 获取Bitamp的信息 调用AndroidBitmap_getInfo()用来获取Bitmap的信息。 AndroidBitmapInfo bitmapInfo; AndroidBitmap_getInfo(env, bitmap, bitmapInfo);6.2 获取Bitmap像素内容 调用AndroidBitmap_lockPixels()用来获取Bitmap的像素内容。 同时记得需要调用AndroidBitmap_unlockPixels()来释放资源这两个API是配对使用的。 //拿到像素内容 void *bitmapPixels; AndroidBitmap_lockPixels(env, bitmap, bitmapPixels);//释放资源 AndroidBitmap_unlockPixels(env, bitmap);6.3 JNI中创建Bitamp 直接复制这个封装好的方法进行调用就好 jobject generateBitmap(JNIEnv *env, uint32_t width, uint32_t height) {// 获取Bitmap类引用jclass bitmapCls env-FindClass(android/graphics/Bitmap);// 获取Bitmap构造方法的引用jmethodID createBitmapFunction env-GetStaticMethodID(bitmapCls, createBitmap,(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;);jstring configName env-NewStringUTF(ARGB_8888);jclass bitmapConfigClass env-FindClass(android/graphics/Bitmap$Config);jmethodID valueOfBitmapConfigFunction env-GetStaticMethodID(bitmapConfigClass, valueOf, (Ljava/lang/String;)Landroid/graphics/Bitmap$Config;);jobject bitmapConfig env-CallStaticObjectMethod(bitmapConfigClass,valueOfBitmapConfigFunction, configName);jobject newBitmap env-CallStaticObjectMethod(bitmapCls, createBitmapFunction, width, height,bitmapConfig);return newBitmap; }6.4 实现Bitmap镜像操作 定义JNI external fun mirrorBitmap(bitmap: Bitmap) : Bitmap实现C代码 extern C JNIEXPORT jobject JNICALL Java_com_heiko_myncnnlib_NcnnNativeLib_mirrorBitmap(JNIEnv *env, jobject thiz, jobject bitmap) {AndroidBitmapInfo bitmapInfo;AndroidBitmap_getInfo(env, bitmap, bitmapInfo);__android_log_print(ANDROID_LOG_DEBUG, jniBitmap, width:%d,height:%d, bitmapInfo.width,bitmapInfo.height);//拿到像素内容void *bitmapPixels;AndroidBitmap_lockPixels(env, bitmap, bitmapPixels);uint32_t newWidth bitmapInfo.width;uint32_t newHeight bitmapInfo.height;uint32_t *newBitmapPixels new uint32_t[newWidth * newHeight];int index 0;//遍历Bitmap像素将左右的像素进行互换 (镜像操作)for (int y 0; y newHeight; y) {for (int x newWidth - 1; x 0; x--) {uint32_t pixel ((uint32_t *) bitmapPixels)[index];newBitmapPixels[newWidth * y x] pixel;}}AndroidBitmap_unlockPixels(env, bitmap);//生成新的Bitmapjobject newBitmap generateBitmap(env, newWidth, newHeight);void *resultBitmapPixels;AndroidBitmap_lockPixels(env, newBitmap, resultBitmapPixels);//拷贝memcpy((uint32_t *)resultBitmapPixels, newBitmapPixels, sizeof(uint32_t) * newWidth * newHeight);AndroidBitmap_unlockPixels(env,newBitmap);delete [] newBitmapPixels;return newBitmap; }进行调用 var bitmap BitmapFactory.decodeResource(resources,R.drawable.img_test) binding.img1.setImageBitmap(bitmap)binding.btnMirrorImage.setOnClickListener {bitmap nativeLib.mirrorBitmap(bitmap)binding.img1.setImageBitmap(bitmap) }进行程序点击Button可以发现图片执行了镜像操作。 7. 其他 7.1 CMake 关于CMake可以看我的另一篇博客 : Android NDK CMakeLists.txt 常用命令说明 7.2 参考 感谢 Android CMake以及NDK实践基础
http://www.zqtcl.cn/news/921920/

相关文章:

  • 网站建设开发感想网站建设公司接单
  • 建立网站后怎样收费吗设计图纸网站
  • asp网站密码从零开始做一个网站需要多少钱
  • 网站建设中需求分析报告微信 网站 优劣势
  • 湖南建设长沙网站建设价格关于网站的建设论文
  • 玉林网站制作网站建设的常用词
  • linux系统网站空间用凡科做网站的费用
  • 如何给别人做网站百度推广助手app
  • 哈市哪里网站做的好新颖的网站策划
  • 网站建设 方案书微信登录wordpress免费
  • 兰州网站建设企业名录洛可可设计公司估值
  • 广州做网站地方兰州做网站的公司有哪些
  • 招标网站哪个好适合学生做网站的图片
  • 台州seo网站排名优化外包服务公司
  • 汉川网站推广服务网页站点不安全
  • wdcp网站搬家嘉兴做网站优化的公司
  • 网站规划和建设度假区网站建设方案
  • 做网站前端用什么软件好在线种子资源网
  • 怎样修改网站关键词昌平做网站的公司
  • 网站建设调研文档网站最下面版权模板
  • 建外贸网站有效果吗开发电商平台需要多少钱
  • 成都网站建设维护网页制作价格私活
  • 建设银行网站登陆不上做本地的分类信息网站
  • 公司网站建设哪里实惠网页设计作业百度网盘
  • 如何seo网站挣钱不同企业的网络营销网站
  • 自己做网站有什么用网站怎样设计网址
  • 做任务的网站有那些wordpress链接在哪里
  • 免费建站模板网站招聘网站哪个好
  • 网站建站推广是啥意思高端网站建设浩森宇特
  • 长治电子商务网站建设中国建设银行总行官方网站