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

87网站建设工作室网站后端技术有哪些

87网站建设工作室,网站后端技术有哪些,岳阳网上房地产,网站开发流程荆州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.pierceye.com/news/525638/

相关文章:

  • 哪个网站公司做的好百科网站推广
  • 网站首页做很多个关键词做羊水亲子鉴定网站
  • 漳州 做网站东昌府区住房和城乡建设局网站
  • 网站前台首页无法显示济南市网站
  • c2c网站开发毕业设计东莞网站营销公司
  • 网站维护企业wordpress数字分页
  • 怎么判断一个网站做的好不好discuz 企业网站
  • 编程入门自学网站中国室内设计网站排名
  • 北京房山网站建设产品更新培训如何用手机编程游戏
  • 重庆城乡建设网站神马搜索seo优化排名
  • 北京响应式网站制作公司一个网站的建设流程有哪些资料
  • 专做淘宝的网站全部网站
  • 济南网站app开发的相册网站建设目的
  • 哈尔滨网站优化推广公司wordpress引用js插件
  • 网站优化软件排名器制作文字图片
  • 广州十大网站建设怎么做网站的301
  • 青岛网站运营推广移动端网站开发项目报告
  • 上海 培训网站建设现在最火的推广平台有哪些
  • 公司网站制作设计联系方式网站如何做ssl认证
  • 中国城乡住房和城乡建设部网站首页内江seo
  • 外贸经常用的网站深圳专业网站建设定制
  • 网站建设项目签约仪式举行注册网站不用手机短信验证的
  • 汕头建站模板源码网站如何做视频链接地址
  • wordpress 取消赞广东seo推广软件
  • 网站一个多少钱做网站意义和目的
  • 做网站要用编程吗学做宝宝衣服的网站
  • 网站建设有哪些方法怎么在百度上注册店铺
  • 网站获取访问者qqwordpress网站布置视频
  • 南宁怎么做seo团队网站排名优化培训电话
  • 做百科权威网站有哪些开发网站访问流量赚钱