日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

java jmi的基本思想_jmi: JMI 是 JNI 的 C++11/14封装,目的是为了简化JNI使用

發布時間:2024/7/19 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java jmi的基本思想_jmi: JMI 是 JNI 的 C++11/14封装,目的是为了简化JNI使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JMI

JNI Modern Interface in C++

特性

支持 Java 方法輸入、輸出參數

jclass、jmethodID、field 自動緩存

C++ 和 Java 方法屬性一致,如靜態方法對應 C++ 靜態成員函數

無需操心局部引用泄漏

getEnv() 支持任意線程,無需關心 detach

編譯器推導 java 類型及方法簽名,并只生成一次

支持 JNI 原生的各種類型、jmi 的 JObject、C/C++ string 及上述類型的數組形式(vector, valarray, array等) 作為函數參數、返回值及 field 類型

提供了方便使用的常用函數: to_string(std::string), from_string(jstring), android::application()

簡單易用,用戶代碼極簡

例子:

JNI_OnLoad 中設置 java vm: jmi::javaVM(vm);

創建 SurfaceTexture:

// 在任意 jmi::JObject 可見范圍內定義 SurfaceTexture tag 類

struct SurfaceTexture : jmi::ClassTag { static std::string name() {return "android/graphics/SurfaceTexture";}};

...

GLuint tex = ...

...

jmi::JObject texture;

if (!texture.create(tex)) {

// texture.error() ...

}

從 SurfaceTexture 構造 Surface:

struct Surface : jmi::ClassTag { static std::string name() {return "android.view.Surface";}}; // '.' or '/'

...

jmi::JObject surface;

surface.create(texture);

調用 void 方法:

texture.call("updateTexImage");

texture.call("updateTexImage");

調用含輸出參數的方法:

float mat4[16]; // or std::array, valarray

texture.call("getTransformMatrix", std::ref(mat4)); // use std::ref() if parameter should be modified by jni method

若出參類型是 JObject<...> 或器子類, 則可不使用std::ref(),因為對象不會改變,可能只是某些fields被方法修改了,如

MediaCodec::BufferInfo bi;

bi.create();

codec.dequeueOutputBuffer(bi, timeout); // bi is of type MediaCodec::BufferInfo&

調用有返回值的方法:

jlong t = texture.call("getTimestamp");

jmethodID 緩存

call/callStatic("methodName", ....) 每次都會調用 GetMethodID/GetStaticMethodID(), 而 call/callStatic<...mtag>(...) 只會調用一次, 其中 MTag 是 jmi:MethodTag 的子類,實現了 static const char* name() { return "methodName";}.

// GetMethodID() 對于每個不同的方法只會被調用一次

struct UpdateTexImage : jmi::MethodTag { static const char* name() {return "updateTexImage";}};

struct GetTimestamp : jmi::MethodTag { static const char* name() {return "getTimestamp";}};

struct GetTransformMatrix : jmi::MethodTag { static const char* name() {return "getTransformMatrix";}};

...

texture.call(); // or texture.call();

jlong t = texture.call();

texture.call(std::ref(mat4)); // use std::ref() if parameter should be modified by jni method

Field 接口

Field 接口支持可緩存和無緩存 jfieldID

通過 FieldTag 使用可緩存 jfieldID

JObject obj;

...

struct MyIntField : FieldTag { static const char* name() {return "myIntFieldName";} };

auto ifield = obj.field();

jfieldID ifid = ifield; // 或 ifield.id()

ifield.set(1234);

int ivalue = ifield; // 或 ifield.get();

// 靜態 field 也一樣,除了使用的是靜態方法 JObject::staticField

struct MyStrFieldS : FieldTag { static const char* name() {return "myStaticStrFieldName";} };

auto& ifields = JObject::staticField<:string myintfields>(); // it can be an ref

jfieldID ifids = ifields; // 或 ifield.id()

ifields.set("JMI static field test");

ifields = "assign";

std::string ivalues = ifields; // 或 ifield.get();

通過 field 名字使用無緩存 jfieldID

auto ifield = obj.field("myIntFieldName");

...

給 Java 類寫個 C++ 類

創建 JObject 或把其對象作為成員變量,或使用 CRTP JObject。 每個方法是想通常不超過3行代碼,也可以使用一些宏使每個方法實現只需一行代碼, 參見 JMITest 及 Project AND

使用編譯器生成的簽名

模版 string signature_of(T) 返回類型 T 的簽名. T 可以是 JMI 支持的類型(除了jobject,因為其類型是運行時確定的)、reference_wrapper、void 及由以上類型作為返回類型和參數類型的函數類型

string signature_of(T) 返回的 string 是靜態存儲的,使用 signature_of(...).data() 是安全的

例子:

void native_test_impl(JNIEnv *env , jobject thiz, ...) {}

staitc const JNINativeMethod gMethods[] = {

{"native_test", signature_of(native_test_impl).data(), native_test_impl},

...

};

也許你發現了可以用宏來簡化

#define DEFINE_METHOD(M) {#M, signature_of(M##_impl).data(), M##_impl}

staitc const JNINativeMethod gMethods[] = {

DEFINE_METHOD(native_test),

...

}

已知問題

如果返回類型與前 n 個參數類型是一樣的,需要顯示指定這些類型

為什么 JObject 是個模版?

為了支持 jclass、jmethodID、jfieldID 緩存

已測編譯器

g++ >= 4.9, clang >= 3.4.2

TODO

modern C++ 類自動生成腳本

簽名無需運行時string

MIT License

Copyright (c) 2016-2019 WangBin

總結

以上是生活随笔為你收集整理的java jmi的基本思想_jmi: JMI 是 JNI 的 C++11/14封装,目的是为了简化JNI使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 影音先锋中文字幕在线播放 | 国产色网站 | 性xxxx18| 精品久久国产视频 | 日本a免费 | 特级西西人体444www | 成人精品三级av在线看 | 久久久久久一级片 | 亚洲一卡二卡三卡四卡 | 狠狠干在线视频 | 国产无遮挡又黄又爽又色 | 精品欧美乱码久久久久久1区2区 | 久操福利在线 | a激情 | 在线色网| 国产免费黄色网址 | 懂色一区二区二区av免费观看 | 久久亚洲一区二区三区四区五区 | 青娱乐在线免费观看 | 色综合久久精品亚洲国产 | 91国产精品一区 | 男女激情av| 日韩色综合网 | 日本不卡一区二区在线观看 | 国产精品久久久久久久一区探花 | 天海翼一区二区 | 狠狠干2024| 久久婷婷伊人 | 国产在线一区二区三区四区 | 青草视频在线观看视频 | 精品国产专区 | 成人h动漫精品一区二区下载 | 婷婷激情五月网 | 亚洲天堂日韩av | 国产成年网站 | 国产精品一区二 | 国产乱子一区二区 | 伊人在线 | 国产主播av| 亚洲免费在线观看av | 91亚洲精品在线 | 亚洲视频手机在线 | 成人午夜精品一区二区三区 | 国产欧美日韩成人 | 黄色小视频链接 | 日产精品久久久久久久蜜臀 | 四虎国产精品永久在线国在线 | 影音先锋人妻啪啪av资源网站 | 久久成人久久爱 | 一级黄色特级片 | 午夜三级影院 | 欧美色吊丝 | 亚洲天码中字 | 在线日韩视频 | 成人免费在线看片 | 日韩中文字幕观看 | 精品麻豆av | 天天综合中文字幕 | 日屁网站 | 日韩专区第一页 | 欧美在线视频a | 色片网站在线观看 | eeuss鲁丝片一区二区三区 | 91大片免费看 | 男人天堂网在线 | 四虎视频在线 | 久久99热这里只频精品6学生 | 亚洲综合在线成人 | 国产精品免费av一区二区三区 | 丰满少妇被猛烈进入一区二区 | 国产美女无遮挡免费视频 | 成人1区 | 六月婷婷激情 | 一区二区三区欧美日韩 | 在线观看三级视频 | 3o一40一50一6o女人毛片 | jizz少妇 | 久草福利资源 | 91麻豆产精品久久久久久 | 日韩视频 中文字幕 | 欧美操操操 | 色av网 | 欧亚一级片 | 日本老年老熟无码 | 午夜av免费观看 | 亚洲国产一区视频 | 久操视频网站 | 国产精品国产精品 | 老司机精品福利视频 | 99视频一区| 亚洲AV无码精品一区二区三区 | 亚洲a图 | www欧美色| 国产ts人妖系列高潮 | 激情视频在线播放 | 无码免费一区二区三区免费播放 | 国产成人精品一区二区三区视频 | 日韩羞羞| 嫩操影院 |