11 Ocak 2018 Perşembe

JNI JNIEnv Sınıfı

Giriş
Bu sınıf JNI'da kullanılan belki de en önemli sınıf.

CallVoidMethod metodu
Şöyle yaparız.
jobject runnable = ...;
jmethodID mid = ...;
env->CallVoidMethod(runnable, mid);
FindClass metodu
C kodundan Java kodunu çağırırken, Java sınıfını bulmak için kullanılır.
Örnek
Şöyle yaparız.
bool load(const char* classFile)
{   
  JNIEnv* env = ...;
  auto javacls = env->FindClass(classFile);
  if (javacls == nullptr)
  {
    env->ExceptionDescribe();
    return false;
  }
  ...
  return true;
}
Örnek
HashMap nesnesi yaratmak için şöyle yaparız.
jclass hashMapClass= env->FindClass(env, "java/util/HashMap");
jmethodID hashMapInit = env->GetMethodID(env, hashMapClass, "<init>", "(I)V");
jobject hashMapObj = env->NewObject(env, hashMapClass, hashMapInit, mMap.size());
GetArrayLength metodu
Java kodu şöyle olsun.
String[] args = ...;
new JNItest2().helloworld(args);
C kodunda şöyle yaparız.
JNIEXPORT void JNICALL
Java_JNItest2_helloworld(JNIEnv *env,jobject object, jobjectArray args)
{
  int argc = env->GetArrayLength(args);   
}
GetMethodID metodu
C kodundan Java kodunu çağırırken, Java sınıfının metodunu bulmak için kullanılır. Java metod imzaları için kullanılan tablo şöyle.
Type Signature Java Type
1. Z boolean
2. B byte
3. C char
4. D double
5. F float
6. I short
7. J long
8. L object
9. S short
10. V void
11. Lfully-qualified-class;fully-qualified-class
12. [type type[]
13. <init> constructor
Metod imzaları
(Param1;Param2)ReturnType
şeklinde yazılır.

11. maddede string,object[] parametreleri için şöyle yaparız
Ljava/lang/String;[Ljava/lang/Object;
Örnek
Şöyle yaparız.
jclass clz = env->FindClass("class/path/ListDataClass");
jmethodID mid = env->GetMethodID(clz, "getData", "([Lclass/path/ListDataClass;)V");
Örnek
Elimizde şu kod olsun.
map<string, string> mMap;
Bu nesneyi Java HashMap nesnesine çevirmek için şöyle yaparız.
env->PushLocalFrame(256); // fix for local references

jclass hashMapClass= env->FindClass(env, "java/util/HashMap");
jmethodID hashMapInit = env->GetMethodID(env, hashMapClass, "<init>", "(I)V");
jobject hashMapObj = env->NewObject(env, hashMapClass, hashMapInit, mMap.size());
jmethodID hashMapOut = env->GetMethodID(env, hashMapClass, "put",
            "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

for (auto it : mMap)
{
    env->CallObjectMethod(env, hashMap, put,
         env->NewStringUTF(it->first.c_str()),
         env->NewStringUTF(it->second.c_str()));
}

env->PopLocalFrame(hashMap);
GetObjectArrayElement metodu
Java kodu şöyle olsun.
String[] args = ...;
new JNItest2().helloworld(args);
C kodunda şöyle yaparız.
JNIEXPORT void JNICALL
Java_JNItest2_helloworld(JNIEnv *env,jobject object, jobjectArray args)
{
 
  int i = ...
  jstring string = (jstring) env->GetObjectArrayElement(args, i);
  ...
}
GetObjectClass metodu
Şöyle yaparız.
jobject runnable = ...;
jclass cls = env->GetObjectClass( runnable);
GetStaticMethodID metoud
C kodundan Java kodunu çağırırken, FindClass ile bulunan Java nesnesinin static metodunu bulmak için kullanılır.
GetStringChars metodu
İmzası şöyle.
// Returns a pointer to the array of Unicode characters of the string. 
// This pointer is valid until ReleaseStringchars() is called.
const jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy);
GetStringLength metodu
jstring'in uzunluğunu verir. C kodunda şöyle yaparız.
jstring str =...;
int slength = env->GetStringLength(str);
GetStringUTFChars metodu
jstring'in karakterlerini döner. İmzası şöyle
// Returns a pointer to an array of bytes representing the string 
// in modified UTF-8 encoding. This array is valid until it is released 
// by ReleaseStringUTFChars().
const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);
C kodunda şöyle yaparız.
jstring str = ...;
char *jchars = (char *)env->GetStringUTFChars(str,NULL);
Şöyle yaparız.
std::string jstring2string(JNIEnv *env, jstring jStr) {
  if (!jStr)
    return "";

  std::vector<char> charsCode;
  const jchar *chars = env->GetStringChars(jStr, NULL);
  jsize len = env->GetStringLength(jStr);
  jsize i;

  for( i=0;i<len; i++){
    int code = (int)chars[i];
    charsCode.push_back( code );
  }
  env->ReleaseStringChars(jStr, chars);

  return  std::string(charsCode.begin(), charsCode.end());
}
NewIntArray metodu
Şöyle yaparız.
jint count = ...;
jintArray arr = env->NewIntArray (count);
ReleaseStringChars metodu
Şöyle yaparız.
std::string jstring2string(JNIEnv *env, jstring jStr) {
  if (!jStr)
    return "";

  std::vector<char> charsCode;
  const jchar *chars = env->GetStringChars(jStr, NULL);
  ...
  env->ReleaseStringChars(jStr, chars);

  return  std::string(charsCode.begin(), charsCode.end());
}


Hiç yorum yok:

Yorum Gönder