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

创新的网站建设排行榜黄埔建网站公司

创新的网站建设排行榜,黄埔建网站公司,wordpress自定义用户字段,wordpress连接sql1. 前言 最基础的创建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.eeditor.cn/news/123380/

相关文章:

  • 阳网站建设营子区住房和城乡建设局网站
  • 网站建设实训报告wordpress出境游
  • 一个网站占空间有多少g北京注册工作室代理公司
  • 如何把学校网站建设好安卓版下载
  • 网站建设用的是什么软件商丘网站建设哪家好
  • 视频网站的链接怎么做的凡科是大厂吗
  • 知名高校网站建设网站建设开公司现在好做吗
  • 网上花店 网站源代码做网站的大公司
  • 浏览有关小城镇建设的网站 记录云南网站建设定做
  • 黑五手表网站互联网营销培训班
  • 找企业名录的网站凡科注册的网站怎么被百度收录
  • 网站上加一个浮动小框怎么做写作网站名字
  • ios7 风格 网站大连市建设工程招标信息网
  • 咸阳网站开发公司地址汽车网站建设模板
  • 佛山市网站建设分站企业北京企业建站模板
  • 站长统计app软件下载官网做网站的接口是意思
  • 做h5哪些网站好 知乎卫浴网站模板
  • 乐清建设公司网站网站推广优化外包公司
  • wap电影网站建设天河建设网站专家
  • 做网站花都区手机app下载软件安装
  • 网站个性化制作网站建设选哪家公司好
  • 网站集约化建设国内网络营销公司排名
  • 江西省赣州市地图广告优化师工资一般多少
  • 国内摄影作品网站如何自助建网站
  • php网站开发用什么php海口建站网站模板
  • 中国住建部网站查询网柒比贰主题wordpress
  • 用手机域名做网站有多少做电影网站多少带宽
  • 做个外贸网站设计网站开发历史
  • 博罗企业网站建设搬瓦工vps wordpress
  • 行业网站开发专业网站建设包括哪些