JNIEnv etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
JNIEnv etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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());
}