求指教,C++编写JNI中jobect和jstring如何类型转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求指教,C++编写JNI中jobect和jstring如何类型转换相关的知识,希望对你有一定的参考价值。

RT最近接触JNI利用反射取得传入的ArrayList的get方法,但get方法取出结果为object型(本地方法中为_object*吗)如何转换为字符串类型jstring

参考技术A msg = (jbyteArray)(*env)->CallObjectMethod(env,job, mid); if(msg !=0) int counter; int len =(*env)->GetArrayLength(env,msg); jbyte* elems =(*env)-> GetByteArrayElements(env,msg, 0); //for ( counter= 0; counter < len; counter += 3) //jbyte value = (jbyte)(elems[counter] * 0.299 + elems[counter + 2] * 0.114 + elems[counter + 1] * 0.587); //elems[counter] = value; //elems[counter + 1] = value; //elems[counter + 2] = value;

Java JNI - 调用对象方法

【中文标题】Java JNI - 调用对象方法【英文标题】:Java JNI - Calling object method 【发布时间】:2010-01-30 19:06:42 【问题描述】:

我目前正在使用 JNI 编写一些 C++ 代码和 Java 之间的接口。

我在我的 GUI 中收到了一些想要传递给 C++ 事件处理程序的事件。

因此我调用了一个我用 Java 编写的函数。

public void sendToEventQueue( AWTEvent evt ) 
  Mudkiptz.Main.fctC_sendEvent( evt );

此方法位于抽象类 EventHdl 中,我将其用作 keyEventHandler 的超类,在其中我重载了 keyTyped(KeyEvent) 以使用先前声明的方法将 KeyEvent 发送到我的 C++ 事件处理程序。

我的问题是我想从我传递的 KeyEvent 中获取我的 keyEvent keyCode。

JNIEXPORT void JNICALL Java_Mudkiptz_Main_fctC_1sendEvent
(JNIEnv* env, jclass, jobject evt) 
  // Obtenir les infos (Get information)
  jclass keyEventClass = env->FindClass("java/awt/event/KeyEvent");

  if( env->IsInstanceOf(evt, keyEventClass) ) 
    jmethodID getKeyCode = env->GetMethodID(keyEventClass, "getKeyCode", "()I");
    int keyCode = 0;
    keyCode = env->CallIntMethod(evt, getKeyCode);
  
  // getInstance()
  Application::obtenirInstance()->getEventQueue()->push( evt );

但它不起作用...... :(我不习惯 JNI,所以这可能是一个简单的错误,但我非常感谢帮助。

编辑:我应该更准确。方法返回但 keyCode 在它应该给出 keyCode 时总是等于 0。谢谢!

谢谢!

【问题讨论】:

你能详细说明“不起作用”吗?发生什么了?你期望发生什么? 方法签名看起来很有趣。我脑子里没有 JNI 签名规则,但 Java_Mudkiptz_Main_fctC_1sendEvent 看起来不对。为什么函数名中间有个“1”? 对不起,事实上,发生的情况是该方法被调用但当它应该返回正确的KeyCode时总是返回0。对于 JNI 签名,我不理解声明中的 1,但我的界面中的所有其他 JNI 方法都在工作,所以我略过它。谢谢! 【参考方案1】:

我终于发现我做错了什么。似乎 getKeyCode 不是我正在寻找的功能。

为了调试,我去了 java 调用并将事件打印到字符串和 keycode 即使在 java 中也总是等于 0。因此,我检查了转储,并且 keyChar 具有我输入的正确值。所以我改用 getKeyChar 调用,一切正常。

感谢您的帮助!

【讨论】:

以上是关于求指教,C++编写JNI中jobect和jstring如何类型转换的主要内容,如果未能解决你的问题,请参考以下文章

c++算术字数转换,求指教

C++编程题,求大神指教,实在是小白不会。已知速度和时间和加速度。框架也有了,但是真的不太会

转JNI 对象处理

如何编写代码以使用 microsoft visual c++ 调用 JNI [关闭]

c++ 中啥样的指针是裸指针,参数可以是智能指针的引用吗,求高手举例指教

177Java利用JNI调用C++编写的DLL,连接海康人脸抓拍机,实现人脸库全量更新。