Giriş
Bu sınıf JNI'da kullanılan belki de en önemli sınıf.
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 metoduC 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;
}
ÖrnekHashMap 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 metoduJava 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 metoduC 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 TypeMetod imzaları
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
(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");
ÖrnekElimizde ş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 metoduJava 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.
C kodundan Java kodunu çağırırken, FindClass ile bulunan Java nesnesinin static metodunu bulmak için kullanılır.Şöyle yaparız.
jobject runnable = ...;
jclass cls = env->GetObjectClass( runnable);
GetStaticMethodID metoudGetStringChars 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 metodujstring'in uzunluğunu verir. C kodunda şöyle yaparız.
jstring str =...;
int slength = env->GetStringLength(str);
GetStringUTFChars metodujstring'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.
Şö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