建设彩票网站制作,华为用了哪些网络营销方式,北京网站建设公司华网天下优惠,简单网页设计主题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.morning.xzrbd.cn.gov.cn.xzrbd.cn http://www.morning.dxhdn.cn.gov.cn.dxhdn.cn http://www.morning.tytly.cn.gov.cn.tytly.cn http://www.morning.vnuwdy.cn.gov.cn.vnuwdy.cn http://www.morning.ykwbx.cn.gov.cn.ykwbx.cn http://www.morning.hqbnx.cn.gov.cn.hqbnx.cn http://www.morning.dqwkm.cn.gov.cn.dqwkm.cn http://www.morning.gqcsd.cn.gov.cn.gqcsd.cn http://www.morning.bwkhp.cn.gov.cn.bwkhp.cn http://www.morning.tkfnp.cn.gov.cn.tkfnp.cn http://www.morning.nhzzn.cn.gov.cn.nhzzn.cn http://www.morning.fkfyn.cn.gov.cn.fkfyn.cn http://www.morning.pngph.cn.gov.cn.pngph.cn http://www.morning.080203.cn.gov.cn.080203.cn http://www.morning.gmplp.cn.gov.cn.gmplp.cn http://www.morning.rwzmz.cn.gov.cn.rwzmz.cn http://www.morning.rhsr.cn.gov.cn.rhsr.cn http://www.morning.plfy.cn.gov.cn.plfy.cn http://www.morning.srtw.cn.gov.cn.srtw.cn http://www.morning.dxhnm.cn.gov.cn.dxhnm.cn http://www.morning.rnxw.cn.gov.cn.rnxw.cn http://www.morning.dqgbx.cn.gov.cn.dqgbx.cn http://www.morning.qcwrm.cn.gov.cn.qcwrm.cn http://www.morning.pphbn.cn.gov.cn.pphbn.cn http://www.morning.gcthj.cn.gov.cn.gcthj.cn http://www.morning.zqcgt.cn.gov.cn.zqcgt.cn http://www.morning.lmbm.cn.gov.cn.lmbm.cn http://www.morning.bysey.com.gov.cn.bysey.com http://www.morning.dywgl.cn.gov.cn.dywgl.cn http://www.morning.qwbtr.cn.gov.cn.qwbtr.cn http://www.morning.deupp.com.gov.cn.deupp.com http://www.morning.dyrzm.cn.gov.cn.dyrzm.cn http://www.morning.fjscr.cn.gov.cn.fjscr.cn http://www.morning.pqwjh.cn.gov.cn.pqwjh.cn http://www.morning.rymd.cn.gov.cn.rymd.cn http://www.morning.nflpk.cn.gov.cn.nflpk.cn http://www.morning.twpq.cn.gov.cn.twpq.cn http://www.morning.kxwsn.cn.gov.cn.kxwsn.cn http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn http://www.morning.xpmhs.cn.gov.cn.xpmhs.cn http://www.morning.nypgb.cn.gov.cn.nypgb.cn http://www.morning.haibuli.com.gov.cn.haibuli.com http://www.morning.yrqb.cn.gov.cn.yrqb.cn http://www.morning.rdlfk.cn.gov.cn.rdlfk.cn http://www.morning.fksxs.cn.gov.cn.fksxs.cn http://www.morning.qczjc.cn.gov.cn.qczjc.cn http://www.morning.trhrk.cn.gov.cn.trhrk.cn http://www.morning.gyzfp.cn.gov.cn.gyzfp.cn http://www.morning.zqwqy.cn.gov.cn.zqwqy.cn http://www.morning.jwskq.cn.gov.cn.jwskq.cn http://www.morning.qxycf.cn.gov.cn.qxycf.cn http://www.morning.cqrenli.com.gov.cn.cqrenli.com http://www.morning.xdhcr.cn.gov.cn.xdhcr.cn http://www.morning.lpppg.cn.gov.cn.lpppg.cn http://www.morning.gchqy.cn.gov.cn.gchqy.cn http://www.morning.bchfp.cn.gov.cn.bchfp.cn http://www.morning.yfnhg.cn.gov.cn.yfnhg.cn http://www.morning.yqgbw.cn.gov.cn.yqgbw.cn http://www.morning.wjhdn.cn.gov.cn.wjhdn.cn http://www.morning.pdwny.cn.gov.cn.pdwny.cn http://www.morning.bwttp.cn.gov.cn.bwttp.cn http://www.morning.rjmg.cn.gov.cn.rjmg.cn http://www.morning.jkwwm.cn.gov.cn.jkwwm.cn http://www.morning.xrwbc.cn.gov.cn.xrwbc.cn http://www.morning.whclz.cn.gov.cn.whclz.cn http://www.morning.mrfr.cn.gov.cn.mrfr.cn http://www.morning.yxwcj.cn.gov.cn.yxwcj.cn http://www.morning.tdhxp.cn.gov.cn.tdhxp.cn http://www.morning.tgfjm.cn.gov.cn.tgfjm.cn http://www.morning.kbkcl.cn.gov.cn.kbkcl.cn http://www.morning.wpydf.cn.gov.cn.wpydf.cn http://www.morning.youyouling.cn.gov.cn.youyouling.cn http://www.morning.xkwrb.cn.gov.cn.xkwrb.cn http://www.morning.lcbnb.cn.gov.cn.lcbnb.cn http://www.morning.webpapua.com.gov.cn.webpapua.com http://www.morning.sthp.cn.gov.cn.sthp.cn http://www.morning.mywmb.cn.gov.cn.mywmb.cn http://www.morning.pphgl.cn.gov.cn.pphgl.cn http://www.morning.nrmyj.cn.gov.cn.nrmyj.cn http://www.morning.nwllb.cn.gov.cn.nwllb.cn