linphone-ios/tools/my_jni.h
2016-07-27 11:58:38 +02:00

108 lines
4.1 KiB
C++

/*
my_jni.cc
Copyright (C) 2013 Belledonne Communications, Grenoble, France
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MY_JNI__H
#define __MY_JNI__H
#include <jni.h>
extern "C" {
#include "linphonecore_utils.h"
}
#define defCallMethod(Type) \
template <typename ReturnType> \
static ReturnType call##Type##Method(JNIEnv *env, jobject obj, const char *className, const char *methodName, \
const char *methodSignature, ...) { \
jclass my_class = env->GetObjectClass(obj); \
if(my_class == 0) { \
ms_error("Can't get %s JNI class", className); \
return NULL; \
} \
jmethodID my_method = env->GetMethodID(my_class, methodName, methodSignature); \
if(my_method == 0) { \
ms_error("Can't get %s %s %s method", className, methodName, methodSignature); \
return NULL; \
} \
va_list vl; \
va_start(vl, methodSignature); \
ReturnType ret = env->Call##Type##MethodV(obj, my_method, vl); \
va_end(vl); \
return ret; \
} \
#define defGetterTypeField(Type, JavaType, JavaStringType) \
template <typename ValueType> \
static ValueType get##Type##Field(JNIEnv *env, jobject obj, const char *className, const char *fieldName) { \
jclass my_class = env->GetObjectClass(obj); \
if(my_class == 0) { \
ms_error("Can't get %s JNI class", className); \
return NULL; \
} \
jfieldID my_field = env->GetFieldID(my_class, fieldName, JavaStringType); \
if(my_field == 0) { \
ms_error("Can't get %s %s field", className, fieldName); \
return NULL; \
} \
return (ValueType) env->Get##Type##Field(obj, my_field); \
} \
#define defSetterTypeField(Type, JavaType, JavaStringType) \
template <typename ValueType> \
static bool set##Type##Field(JNIEnv *env, jobject obj, const char *className, const char *fieldName, ValueType val) { \
jclass my_class = env->GetObjectClass(obj); \
if(my_class == 0) { \
ms_error("Can't get %s JNI class", className); \
return false; \
} \
jfieldID my_field = env->GetFieldID(my_class, fieldName, JavaStringType); \
if(my_field == 0) { \
ms_error("Can't get %s %s field", className, fieldName); \
return false; \
} \
env->Set##Type##Field(obj, my_field, (JavaType) val); \
return true; \
} \
#define defGetterAndSetterTypeField(Type, JavaType, JavaStringType) \
defGetterTypeField(Type, JavaType, JavaStringType) \
defSetterTypeField(Type, JavaType, JavaStringType) \
namespace my_jni {
template <typename ReturnType>
static void callVoidMethod(JNIEnv *env, jobject obj, const char *className, const char *methodName,
const char *methodSignature, ...) {
jclass my_class = env->GetObjectClass(obj);
if(my_class == 0) {
ms_error("Can't get %s JNI class", className);
return;
}
jmethodID my_method = env->GetMethodID(my_class, methodName, methodSignature);
if(my_method == 0) {
ms_error("Can't get %s %s %s method", className, methodName, methodSignature);
return;
}
va_list vl;
va_start(vl, methodSignature);
env->CallVoidMethodV(obj, my_method, vl);
va_end(vl);
}
defCallMethod(Object)
defGetterAndSetterTypeField(Long, jlong, "J")
}
#endif //__MY_JNI__H