Пример #1
0
 JNIAttach::JNIAttach(JNIEnv* env)
 {
   if (!ThreadJNI.get())
     ThreadJNI.reset(new JNIHandle);
   if (env)
   {
     assert(!ThreadJNI->env || env == ThreadJNI->env);
     JVM(env);
     ThreadJNI->env = env;
   }
   else if (!ThreadJNI->env)
   {
     JavaVM* jvm = JVM();
     assert(jvm);
     if (jvm->GetEnv((void**)&ThreadJNI->env, QI_JNI_MIN_VERSION) != JNI_OK ||
         ThreadJNI->env == 0)
     {
       char threadName[] = "qimessaging-thread";
       JavaVMAttachArgs args = { JNI_VERSION_1_6, threadName, 0 };
       if (JVM()->AttachCurrentThread((envPtr)&ThreadJNI->env, &args) != JNI_OK ||
           ThreadJNI->env == 0)
       {
         qiLogError() << "Cannot attach callback thread to Java VM";
         throw std::runtime_error("Cannot attach callback thread to Java VM");
       }
       ThreadJNI->attached = true;
     }
   }
   ++ThreadJNI->lockCount;
 }
Пример #2
0
jlong   Java_com_aldebaran_qimessaging_GenericObject_qiObjectBuilderCreate(JNIEnv* env, jobject QI_UNUSED(jobj))
{
  // Keep a pointer on JavaVM singleton if not already set.
  JVM(env);

  qi::DynamicObjectBuilder *ob = new qi::DynamicObjectBuilder();
  return (jlong) ob;
}
Пример #3
0
    // Get JNI environment pointer, valid in current thread.
    JNIEnv*     env()
    {
      JNIEnv* env = 0;

      JVM()->GetEnv(reinterpret_cast<void**>(&env), QI_JNI_MIN_VERSION);
      if (!env)
      {
        qiLogError() << "Cannot get JNI environment from JVM";
        return 0;
      }

      if (JVM()->AttachCurrentThread(reinterpret_cast<envPtr>(&env), (void*)0) != JNI_OK)
      {
        qiLogError() << "Cannot attach current thread to JVM";
        return 0;
      }

      return env;
    }
Пример #4
0
jobject Java_com_aldebaran_qimessaging_DynamicObjectBuilder_object(JNIEnv* env, jobject QI_UNUSED(jobj), jlong pObjectBuilder)
{
  qi::DynamicObjectBuilder *ob = reinterpret_cast<qi::DynamicObjectBuilder *>(pObjectBuilder);
  qi::AnyObject *obj = new qi::AnyObject();
  qi::AnyObject &o = *(reinterpret_cast<qi::AnyObject *>(obj));

  JVM(env);
  o = ob->object();

  JNIObject jobj(obj);
  return jobj.object();
}
Пример #5
0
JNIHashTable::JNIHashTable()
{
   JVM()->GetEnv((void**) &_env, QI_JNI_MIN_VERSION);
  _cls = _env->FindClass("java/util/Hashtable");

  jmethodID mid = _env->GetMethodID(_cls, "<init>", "()V");
  if (!mid)
  {
    qiLogFatal() << "JNIHashTable::JNIHashTable : Cannot call constructor";
    throw std::runtime_error("JNIHashTable::JNIHashTable : Cannot call constructor");
  }

  _obj = _env->NewObject(_cls, mid);
}
Пример #6
0
JNIList::JNIList()
{
  JVM()->GetEnv((void**) &_env, QI_JNI_MIN_VERSION);
 _cls = qi::jni::clazz("List");

 jmethodID mid = _env->GetMethodID(_cls, "<init>", "()V");
 if (!mid)
 {
   qiLogFatal("qimessaging.jni") << "JNIList::JNIList: Cannot call constructor";
   throw std::runtime_error("JNIList::JNIList: Cannot call constructor");
 }

 _obj = _env->NewObject(_cls, mid);
}
Пример #7
0
    JNIAttach::~JNIAttach()
    {
      assert(ThreadJNI->lockCount > 0);
      --ThreadJNI->lockCount;

      if (ThreadJNI->lockCount == 0)
      {
        if (ThreadJNI->attached)
        {
          if (JVM()->DetachCurrentThread() != JNI_OK)
          {
            qiLogError() << "Cannot detach from current thread";
          }
          ThreadJNI->attached = false;
        }
        ThreadJNI->env = 0;
      }
    }
Пример #8
0
void Java_com_aldebaran_qi_EmbeddedTools_initTupleInTypeSystem(JNIEnv* env, jobject QI_UNUSED(jobj), jobject t1, jobject t2, jobject t3, jobject t4, jobject t5, jobject t6, jobject t7, jobject t8, jobject t9, jobject t10, jobject t11, jobject t12, jobject t13, jobject t14, jobject t15, jobject t16, jobject t17, jobject t18, jobject t19, jobject t20, jobject t21, jobject t22, jobject t23, jobject t24, jobject t25, jobject t26, jobject t27, jobject t28, jobject t29, jobject t30, jobject t31, jobject t32)
{
  JVM(env);

  supportedTypes["Tuple1"] = env->NewGlobalRef(t1);
  supportedTypes["Tuple2"] = env->NewGlobalRef(t2);
  supportedTypes["Tuple3"] = env->NewGlobalRef(t3);
  supportedTypes["Tuple4"] = env->NewGlobalRef(t4);
  supportedTypes["Tuple5"] = env->NewGlobalRef(t5);
  supportedTypes["Tuple6"] = env->NewGlobalRef(t6);
  supportedTypes["Tuple7"] = env->NewGlobalRef(t7);
  supportedTypes["Tuple8"] = env->NewGlobalRef(t8);
  supportedTypes["Tuple9"] = env->NewGlobalRef(t9);
  supportedTypes["Tuple10"] = env->NewGlobalRef(t10);
  supportedTypes["Tuple11"] = env->NewGlobalRef(t11);
  supportedTypes["Tuple12"] = env->NewGlobalRef(t12);
  supportedTypes["Tuple13"] = env->NewGlobalRef(t13);
  supportedTypes["Tuple14"] = env->NewGlobalRef(t14);
  supportedTypes["Tuple15"] = env->NewGlobalRef(t15);
  supportedTypes["Tuple16"] = env->NewGlobalRef(t16);
  supportedTypes["Tuple17"] = env->NewGlobalRef(t17);
  supportedTypes["Tuple18"] = env->NewGlobalRef(t18);
  supportedTypes["Tuple19"] = env->NewGlobalRef(t19);
  supportedTypes["Tuple20"] = env->NewGlobalRef(t20);
  supportedTypes["Tuple21"] = env->NewGlobalRef(t21);
  supportedTypes["Tuple22"] = env->NewGlobalRef(t22);
  supportedTypes["Tuple23"] = env->NewGlobalRef(t23);
  supportedTypes["Tuple24"] = env->NewGlobalRef(t24);
  supportedTypes["Tuple25"] = env->NewGlobalRef(t25);
  supportedTypes["Tuple26"] = env->NewGlobalRef(t26);
  supportedTypes["Tuple27"] = env->NewGlobalRef(t27);
  supportedTypes["Tuple28"] = env->NewGlobalRef(t28);
  supportedTypes["Tuple29"] = env->NewGlobalRef(t29);
  supportedTypes["Tuple30"] = env->NewGlobalRef(t30);
  supportedTypes["Tuple31"] = env->NewGlobalRef(t31);
  supportedTypes["Tuple32"] = env->NewGlobalRef(t32);


  for (std::map<std::string, jobject>::iterator it = supportedTypes.begin(); it != supportedTypes.end(); ++it)
  {
    if (it->second == 0)
      qiLogError() << it->first << ": Initialization failed.";
  }
}
Пример #9
0
/*
 * To work correctly, QiMessaging<->java type system needs to compare type class template.
 * Unfortunately, call template cannot be retrieve on native android thread, that is why
 * type instance are stored in supportedTypes map.
 */
void Java_com_aldebaran_qi_EmbeddedTools_initTypeSystem(JNIEnv* env, jobject QI_UNUSED(jobj), jobject str, jobject i, jobject f, jobject d, jobject l, jobject m, jobject al, jobject tuple, jobject obj, jobject b, jobject fut)
{
  JVM(env);

  supportedTypes["String"] = env->NewGlobalRef(str);
  supportedTypes["Integer"] = env->NewGlobalRef(i);
  supportedTypes["Float"] = env->NewGlobalRef(f);
  supportedTypes["Double"] = env->NewGlobalRef(d);
  supportedTypes["Long"] = env->NewGlobalRef(l);
  supportedTypes["Map"] = env->NewGlobalRef(m);
  supportedTypes["List"] = env->NewGlobalRef(al);
  supportedTypes["Tuple"] = env->NewGlobalRef(tuple);
  supportedTypes["Object"] = env->NewGlobalRef(obj);
  supportedTypes["Boolean"] = env->NewGlobalRef(b);
  supportedTypes["Future"] = env->NewGlobalRef(fut);

  for (std::map<std::string, jobject>::iterator it = supportedTypes.begin(); it != supportedTypes.end(); ++it)
  {
    if (it->second == 0)
      qiLogFatal() << it->first << ": Initialization failed.";
  }
}
Пример #10
0
JNIHashTable::JNIHashTable(jobject obj)
{
   JVM()->GetEnv((void**) &_env, QI_JNI_MIN_VERSION);
   _obj = obj;
  _cls = _env->FindClass("java/util/Hashtable");
}
Пример #11
0
JNIEnumeration::JNIEnumeration(jobject obj)
{
  JVM()->GetEnv((void**) &_env, QI_JNI_MIN_VERSION);
  _obj = obj;
  _cls = _env->FindClass("java/util/Enumeration");
}
Пример #12
0
JNIList::JNIList(jobject obj)
{
  JVM()->GetEnv((void**) &_env, QI_JNI_MIN_VERSION);
 _obj = obj;
 _cls = qi::jni::clazz("List");
}