示例#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");
}