Merge "Fix warning about recursive loading of libmedia_jni.so" into sc-dev
This commit is contained in:
@@ -43,12 +43,34 @@ struct fields_t {
|
||||
jfieldID nativePlayerInJavaObj; // stores in Java the native JetPlayer object
|
||||
};
|
||||
|
||||
static fields_t javaJetPlayerFields;
|
||||
static fields_t javaJetPlayerFields {};
|
||||
|
||||
#define JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME "mNativePlayerInJavaObj"
|
||||
#define JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME "postEventFromNative"
|
||||
|
||||
static void initializeJavaIDs(JNIEnv* env) {
|
||||
static std::once_flag sJniInitialized;
|
||||
|
||||
std::call_once(sJniInitialized, [](JNIEnv* env) {
|
||||
// Get the JetPlayer java class
|
||||
jclass jetPlayerClass = FindClassOrDie(env, kClassPathName);
|
||||
javaJetPlayerFields.jetClass = MakeGlobalRefOrDie(env, jetPlayerClass);
|
||||
|
||||
// Get the mNativePlayerInJavaObj variable field
|
||||
javaJetPlayerFields.nativePlayerInJavaObj =
|
||||
GetFieldIDOrDie(env, jetPlayerClass, JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "J");
|
||||
|
||||
// Get the callback to post events from this native code to Java
|
||||
javaJetPlayerFields.postNativeEventInJava = GetStaticMethodIDOrDie(env,
|
||||
javaJetPlayerFields.jetClass, JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME,
|
||||
"(Ljava/lang/Object;III)V");
|
||||
}, env);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
/*
|
||||
* This function is called from JetPlayer instance's render thread
|
||||
*/
|
||||
@@ -79,6 +101,8 @@ static jboolean
|
||||
android_media_JetPlayer_setup(JNIEnv *env, jobject thiz, jobject weak_this,
|
||||
jint maxTracks, jint trackBufferSize)
|
||||
{
|
||||
initializeJavaIDs(env);
|
||||
|
||||
//ALOGV("android_media_JetPlayer_setup(): entering.");
|
||||
JetPlayer* lpJet = new JetPlayer(env->NewGlobalRef(weak_this), maxTracks, trackBufferSize);
|
||||
|
||||
@@ -511,28 +535,9 @@ static const JNINativeMethod gMethods[] = {
|
||||
{"native_clearQueue", "()Z", (void *)android_media_JetPlayer_clearQueue},
|
||||
};
|
||||
|
||||
#define JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME "mNativePlayerInJavaObj"
|
||||
#define JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME "postEventFromNative"
|
||||
|
||||
|
||||
int register_android_media_JetPlayer(JNIEnv *env)
|
||||
{
|
||||
javaJetPlayerFields.jetClass = NULL;
|
||||
javaJetPlayerFields.postNativeEventInJava = NULL;
|
||||
javaJetPlayerFields.nativePlayerInJavaObj = NULL;
|
||||
|
||||
// Get the JetPlayer java class
|
||||
jclass jetPlayerClass = FindClassOrDie(env, kClassPathName);
|
||||
javaJetPlayerFields.jetClass = MakeGlobalRefOrDie(env, jetPlayerClass);
|
||||
|
||||
// Get the mNativePlayerInJavaObj variable field
|
||||
javaJetPlayerFields.nativePlayerInJavaObj = GetFieldIDOrDie(env,
|
||||
jetPlayerClass, JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "J");
|
||||
|
||||
// Get the callback to post events from this native code to Java
|
||||
javaJetPlayerFields.postNativeEventInJava = GetStaticMethodIDOrDie(env,
|
||||
javaJetPlayerFields.jetClass, JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME,
|
||||
"(Ljava/lang/Object;III)V");
|
||||
|
||||
return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
|
||||
#include <android_runtime/AndroidRuntime.h>
|
||||
#include <android_runtime/Log.h>
|
||||
#include "core_jni_helpers.h"
|
||||
#include <jni.h>
|
||||
#include <media/stagefright/NuMediaExtractor.h>
|
||||
#include <nativehelper/JNIHelp.h>
|
||||
@@ -48,6 +49,7 @@ using namespace android;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// MtpDatabase methods
|
||||
static jmethodID method_beginSendObject;
|
||||
static jmethodID method_endSendObject;
|
||||
static jmethodID method_rescanFile;
|
||||
@@ -75,6 +77,7 @@ static jmethodID method_endCopyObject;
|
||||
static jmethodID method_getObjectReferences;
|
||||
static jmethodID method_setObjectReferences;
|
||||
|
||||
// MtpDatabase fields.
|
||||
static jfieldID field_context;
|
||||
|
||||
// MtpPropertyList methods
|
||||
@@ -86,6 +89,59 @@ static jmethodID method_getDataTypes;
|
||||
static jmethodID method_getLongValues;
|
||||
static jmethodID method_getStringValues;
|
||||
|
||||
// Initializer for the jfieldIDs and jmethodIDs above. This method must be invoked
|
||||
// before using these static fields and methods for JNI accesses.
|
||||
static void initializeJavaIDs(JNIEnv* env) {
|
||||
static std::once_flag sJniInitialized;
|
||||
|
||||
#define GET_METHOD_ID(name, jclass, signature) \
|
||||
method_##name = GetMethodIDOrDie(env, jclass, #name, signature);
|
||||
|
||||
std::call_once(sJniInitialized, [](JNIEnv* env) {
|
||||
const jclass mdb_class = FindClassOrDie(env, "android/mtp/MtpDatabase");
|
||||
GET_METHOD_ID(beginSendObject, mdb_class, "(Ljava/lang/String;III)I");
|
||||
GET_METHOD_ID(endSendObject, mdb_class, "(IZ)V");
|
||||
GET_METHOD_ID(rescanFile, mdb_class, "(Ljava/lang/String;II)V");
|
||||
GET_METHOD_ID(getObjectList, mdb_class, "(III)[I");
|
||||
GET_METHOD_ID(getNumObjects, mdb_class, "(III)I");
|
||||
GET_METHOD_ID(getSupportedPlaybackFormats, mdb_class, "()[I");
|
||||
GET_METHOD_ID(getSupportedCaptureFormats, mdb_class, "()[I");
|
||||
GET_METHOD_ID(getSupportedObjectProperties, mdb_class, "(I)[I");
|
||||
GET_METHOD_ID(getSupportedDeviceProperties, mdb_class, "()[I");
|
||||
GET_METHOD_ID(setObjectProperty, mdb_class, "(IIJLjava/lang/String;)I");
|
||||
GET_METHOD_ID(getDeviceProperty, mdb_class, "(I[J[C)I");
|
||||
GET_METHOD_ID(setDeviceProperty, mdb_class, "(IJLjava/lang/String;)I");
|
||||
GET_METHOD_ID(getObjectPropertyList, mdb_class, "(IIIII)Landroid/mtp/MtpPropertyList;");
|
||||
GET_METHOD_ID(getObjectInfo, mdb_class, "(I[I[C[J)Z");
|
||||
GET_METHOD_ID(getObjectFilePath, mdb_class, "(I[C[J)I");
|
||||
GET_METHOD_ID(openFilePath, mdb_class, "(Ljava/lang/String;Z)I");
|
||||
GET_METHOD_ID(getThumbnailInfo, mdb_class, "(I[J)Z");
|
||||
GET_METHOD_ID(getThumbnailData, mdb_class, "(I)[B");
|
||||
GET_METHOD_ID(beginDeleteObject, mdb_class, "(I)I");
|
||||
GET_METHOD_ID(endDeleteObject, mdb_class, "(IZ)V");
|
||||
GET_METHOD_ID(beginMoveObject, mdb_class, "(III)I");
|
||||
GET_METHOD_ID(endMoveObject, mdb_class, "(IIIIIZ)V");
|
||||
GET_METHOD_ID(beginCopyObject, mdb_class, "(III)I");
|
||||
GET_METHOD_ID(endCopyObject, mdb_class, "(IZ)V");
|
||||
GET_METHOD_ID(getObjectReferences, mdb_class, "(I)[I");
|
||||
GET_METHOD_ID(setObjectReferences, mdb_class, "(I[I)I");
|
||||
field_context = GetFieldIDOrDie(env, mdb_class, "mNativeContext", "J");
|
||||
|
||||
const jclass mpl_class = FindClassOrDie(env, "android/mtp/MtpPropertyList");
|
||||
GET_METHOD_ID(getCode, mpl_class, "()I");
|
||||
GET_METHOD_ID(getCount, mpl_class, "()I");
|
||||
GET_METHOD_ID(getObjectHandles, mpl_class, "()[I");
|
||||
GET_METHOD_ID(getPropertyCodes, mpl_class, "()[I");
|
||||
GET_METHOD_ID(getDataTypes, mpl_class, "()[I");
|
||||
GET_METHOD_ID(getLongValues, mpl_class, "()[J");
|
||||
GET_METHOD_ID(getStringValues, mpl_class, "()[Ljava/lang/String;");
|
||||
|
||||
return 0;
|
||||
}, env);
|
||||
|
||||
#undef GET_METHOD_ID
|
||||
}
|
||||
|
||||
|
||||
IMtpDatabase* getMtpDatabase(JNIEnv *env, jobject database) {
|
||||
return (IMtpDatabase *)env->GetLongField(database, field_context);
|
||||
@@ -1280,6 +1336,7 @@ MtpProperty* MtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) {
|
||||
static void
|
||||
android_mtp_MtpDatabase_setup(JNIEnv *env, jobject thiz)
|
||||
{
|
||||
initializeJavaIDs(env);
|
||||
MtpDatabase* database = new MtpDatabase(env, thiz);
|
||||
env->SetLongField(thiz, field_context, (jlong)database);
|
||||
checkAndClearExceptionFromCallback(env, __FUNCTION__);
|
||||
@@ -1314,69 +1371,9 @@ static const JNINativeMethod gMtpPropertyGroupMethods[] = {
|
||||
{"format_date_time", "(J)Ljava/lang/String;",
|
||||
(void *)android_mtp_MtpPropertyGroup_format_date_time},
|
||||
};
|
||||
|
||||
#define GET_METHOD_ID(name, jclass, signature) \
|
||||
method_##name = env->GetMethodID(jclass, #name, signature); \
|
||||
if (method_##name == NULL) { \
|
||||
ALOGE("Can't find " #name); \
|
||||
return -1; \
|
||||
} \
|
||||
|
||||
\
|
||||
int register_android_mtp_MtpDatabase(JNIEnv *env)
|
||||
{
|
||||
jclass clazz;
|
||||
|
||||
clazz = env->FindClass("android/mtp/MtpDatabase");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpDatabase");
|
||||
return -1;
|
||||
}
|
||||
GET_METHOD_ID(beginSendObject, clazz, "(Ljava/lang/String;III)I");
|
||||
GET_METHOD_ID(endSendObject, clazz, "(IZ)V");
|
||||
GET_METHOD_ID(rescanFile, clazz, "(Ljava/lang/String;II)V");
|
||||
GET_METHOD_ID(getObjectList, clazz, "(III)[I");
|
||||
GET_METHOD_ID(getNumObjects, clazz, "(III)I");
|
||||
GET_METHOD_ID(getSupportedPlaybackFormats, clazz, "()[I");
|
||||
GET_METHOD_ID(getSupportedCaptureFormats, clazz, "()[I");
|
||||
GET_METHOD_ID(getSupportedObjectProperties, clazz, "(I)[I");
|
||||
GET_METHOD_ID(getSupportedDeviceProperties, clazz, "()[I");
|
||||
GET_METHOD_ID(setObjectProperty, clazz, "(IIJLjava/lang/String;)I");
|
||||
GET_METHOD_ID(getDeviceProperty, clazz, "(I[J[C)I");
|
||||
GET_METHOD_ID(setDeviceProperty, clazz, "(IJLjava/lang/String;)I");
|
||||
GET_METHOD_ID(getObjectPropertyList, clazz, "(IIIII)Landroid/mtp/MtpPropertyList;");
|
||||
GET_METHOD_ID(getObjectInfo, clazz, "(I[I[C[J)Z");
|
||||
GET_METHOD_ID(getObjectFilePath, clazz, "(I[C[J)I");
|
||||
GET_METHOD_ID(openFilePath, clazz, "(Ljava/lang/String;Z)I");
|
||||
GET_METHOD_ID(getThumbnailInfo, clazz, "(I[J)Z");
|
||||
GET_METHOD_ID(getThumbnailData, clazz, "(I)[B");
|
||||
GET_METHOD_ID(beginDeleteObject, clazz, "(I)I");
|
||||
GET_METHOD_ID(endDeleteObject, clazz, "(IZ)V");
|
||||
GET_METHOD_ID(beginMoveObject, clazz, "(III)I");
|
||||
GET_METHOD_ID(endMoveObject, clazz, "(IIIIIZ)V");
|
||||
GET_METHOD_ID(beginCopyObject, clazz, "(III)I");
|
||||
GET_METHOD_ID(endCopyObject, clazz, "(IZ)V");
|
||||
GET_METHOD_ID(getObjectReferences, clazz, "(I)[I");
|
||||
GET_METHOD_ID(setObjectReferences, clazz, "(I[I)I");
|
||||
|
||||
field_context = env->GetFieldID(clazz, "mNativeContext", "J");
|
||||
if (field_context == NULL) {
|
||||
ALOGE("Can't find MtpDatabase.mNativeContext");
|
||||
return -1;
|
||||
}
|
||||
|
||||
clazz = env->FindClass("android/mtp/MtpPropertyList");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpPropertyList");
|
||||
return -1;
|
||||
}
|
||||
GET_METHOD_ID(getCode, clazz, "()I");
|
||||
GET_METHOD_ID(getCount, clazz, "()I");
|
||||
GET_METHOD_ID(getObjectHandles, clazz, "()[I");
|
||||
GET_METHOD_ID(getPropertyCodes, clazz, "()[I");
|
||||
GET_METHOD_ID(getDataTypes, clazz, "()[I");
|
||||
GET_METHOD_ID(getLongValues, clazz, "()[J");
|
||||
GET_METHOD_ID(getStringValues, clazz, "()[Ljava/lang/String;");
|
||||
|
||||
if (AndroidRuntime::registerNativeMethods(env,
|
||||
"android/mtp/MtpDatabase", gMtpDatabaseMethods, NELEM(gMtpDatabaseMethods)))
|
||||
return -1;
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
#include "android_runtime/AndroidRuntime.h"
|
||||
#include "android_runtime/Log.h"
|
||||
#include "core_jni_helpers.h"
|
||||
#include "nativehelper/ScopedLocalRef.h"
|
||||
#include "private/android_filesystem_config.h"
|
||||
|
||||
@@ -107,6 +108,95 @@ static jfieldID field_event_parameter1;
|
||||
static jfieldID field_event_parameter2;
|
||||
static jfieldID field_event_parameter3;
|
||||
|
||||
// Initializer for the jclasses, jfieldIDs and jmethodIDs declared above. This method must be
|
||||
// invoked before using these static fields for JNI accesses.
|
||||
static void initializeJavaIDs(JNIEnv* env) {
|
||||
static std::once_flag sJniInitialized;
|
||||
|
||||
std::call_once(sJniInitialized, [](JNIEnv* env) {
|
||||
clazz_deviceInfo =
|
||||
(jclass)env->NewGlobalRef(FindClassOrDie(env, "android/mtp/MtpDeviceInfo"));
|
||||
constructor_deviceInfo = GetMethodIDOrDie(env, clazz_deviceInfo, "<init>", "()V");
|
||||
field_deviceInfo_manufacturer =
|
||||
GetFieldIDOrDie(env, clazz_deviceInfo, "mManufacturer", "Ljava/lang/String;");
|
||||
field_deviceInfo_model =
|
||||
GetFieldIDOrDie(env, clazz_deviceInfo, "mModel", "Ljava/lang/String;");
|
||||
field_deviceInfo_version =
|
||||
GetFieldIDOrDie(env, clazz_deviceInfo, "mVersion", "Ljava/lang/String;");
|
||||
field_deviceInfo_serialNumber =
|
||||
GetFieldIDOrDie(env, clazz_deviceInfo, "mSerialNumber", "Ljava/lang/String;");
|
||||
field_deviceInfo_operationsSupported =
|
||||
GetFieldIDOrDie(env, clazz_deviceInfo, "mOperationsSupported", "[I");
|
||||
field_deviceInfo_eventsSupported =
|
||||
GetFieldIDOrDie(env, clazz_deviceInfo, "mEventsSupported", "[I");
|
||||
|
||||
clazz_storageInfo =
|
||||
(jclass)env->NewGlobalRef(FindClassOrDie(env, "android/mtp/MtpStorageInfo"));
|
||||
constructor_storageInfo = GetMethodIDOrDie(env, clazz_storageInfo, "<init>", "()V");
|
||||
field_storageInfo_storageId = GetFieldIDOrDie(env, clazz_storageInfo, "mStorageId", "I");
|
||||
field_storageInfo_maxCapacity =
|
||||
GetFieldIDOrDie(env, clazz_storageInfo, "mMaxCapacity", "J");
|
||||
field_storageInfo_freeSpace =
|
||||
GetFieldIDOrDie(env, clazz_storageInfo, "mFreeSpace", "J");
|
||||
field_storageInfo_description =
|
||||
GetFieldIDOrDie(env, clazz_storageInfo, "mDescription", "Ljava/lang/String;");
|
||||
field_storageInfo_volumeIdentifier =
|
||||
GetFieldIDOrDie(env, clazz_storageInfo, "mVolumeIdentifier", "Ljava/lang/String;");
|
||||
|
||||
clazz_objectInfo =
|
||||
(jclass)env->NewGlobalRef(FindClassOrDie(env, "android/mtp/MtpObjectInfo"));
|
||||
constructor_objectInfo = GetMethodIDOrDie(env, clazz_objectInfo, "<init>", "()V");
|
||||
field_objectInfo_handle = GetFieldIDOrDie(env, clazz_objectInfo, "mHandle", "I");
|
||||
field_objectInfo_storageId = GetFieldIDOrDie(env, clazz_objectInfo, "mStorageId", "I");
|
||||
field_objectInfo_format = GetFieldIDOrDie(env, clazz_objectInfo, "mFormat", "I");
|
||||
field_objectInfo_protectionStatus =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mProtectionStatus", "I");
|
||||
field_objectInfo_compressedSize =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mCompressedSize", "I");
|
||||
field_objectInfo_thumbFormat = GetFieldIDOrDie(env, clazz_objectInfo, "mThumbFormat", "I");
|
||||
field_objectInfo_thumbCompressedSize =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mThumbCompressedSize", "I");
|
||||
field_objectInfo_thumbPixWidth =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mThumbPixWidth", "I");
|
||||
field_objectInfo_thumbPixHeight =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mThumbPixHeight", "I");
|
||||
field_objectInfo_imagePixWidth =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mImagePixWidth", "I");
|
||||
field_objectInfo_imagePixHeight =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mImagePixHeight", "I");
|
||||
field_objectInfo_imagePixDepth =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mImagePixDepth", "I");
|
||||
field_objectInfo_parent = GetFieldIDOrDie(env, clazz_objectInfo, "mParent", "I");
|
||||
field_objectInfo_associationType =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mAssociationType", "I");
|
||||
field_objectInfo_associationDesc =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mAssociationDesc", "I");
|
||||
field_objectInfo_sequenceNumber =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mSequenceNumber", "I");
|
||||
field_objectInfo_name =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mName", "Ljava/lang/String;");
|
||||
field_objectInfo_dateCreated = GetFieldIDOrDie(env, clazz_objectInfo, "mDateCreated", "J");
|
||||
field_objectInfo_dateModified =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mDateModified", "J");
|
||||
field_objectInfo_keywords =
|
||||
GetFieldIDOrDie(env, clazz_objectInfo, "mKeywords", "Ljava/lang/String;");
|
||||
|
||||
clazz_event = (jclass)env->NewGlobalRef(FindClassOrDie(env, "android/mtp/MtpEvent"));
|
||||
constructor_event = GetMethodIDOrDie(env, clazz_event, "<init>", "()V");
|
||||
field_event_eventCode = GetFieldIDOrDie(env, clazz_event, "mEventCode", "I");
|
||||
field_event_parameter1 = GetFieldIDOrDie(env, clazz_event, "mParameter1", "I");
|
||||
field_event_parameter2 = GetFieldIDOrDie(env, clazz_event, "mParameter2", "I");
|
||||
field_event_parameter3 = GetFieldIDOrDie(env, clazz_event, "mParameter3", "I");
|
||||
|
||||
const jclass clazz = FindClassOrDie(env, "android/mtp/MtpDevice");
|
||||
field_context = GetFieldIDOrDie(env, clazz, "mNativeContext", "J");
|
||||
|
||||
clazz_io_exception = (jclass)env->NewGlobalRef(FindClassOrDie(env, "java/io/IOException"));
|
||||
clazz_operation_canceled_exception =
|
||||
(jclass)env->NewGlobalRef(FindClassOrDie(env, "android/os/OperationCanceledException"));
|
||||
}, env);
|
||||
}
|
||||
|
||||
class JavaArrayWriter {
|
||||
public:
|
||||
JavaArrayWriter(JNIEnv* env, jbyteArray array) :
|
||||
@@ -132,6 +222,11 @@ private:
|
||||
|
||||
MtpDevice* get_device_from_object(JNIEnv* env, jobject javaDevice)
|
||||
{
|
||||
// get_device_from_object() is called by the majority of JNI methods in this file. Call
|
||||
// `initializeJavaIDs()` here to ensure JNI methodID's, fieldIDs and classes are initialized
|
||||
// before use.
|
||||
initializeJavaIDs(env);
|
||||
|
||||
return (MtpDevice*)env->GetLongField(javaDevice, field_context);
|
||||
}
|
||||
|
||||
@@ -200,6 +295,8 @@ android_mtp_MtpDevice_open(JNIEnv *env, jobject thiz, jstring deviceName, jint f
|
||||
MtpDevice* device = MtpDevice::open(deviceNameStr, fd);
|
||||
env->ReleaseStringUTFChars(deviceName, deviceNameStr);
|
||||
|
||||
// The jfieldID `field_context` needs to be initialized before use below.
|
||||
initializeJavaIDs(env);
|
||||
if (device)
|
||||
env->SetLongField(thiz, field_context, (jlong)device);
|
||||
return (jboolean)(device != NULL);
|
||||
@@ -781,256 +878,7 @@ static const JNINativeMethod gMethods[] = {
|
||||
|
||||
int register_android_mtp_MtpDevice(JNIEnv *env)
|
||||
{
|
||||
jclass clazz;
|
||||
|
||||
ALOGD("register_android_mtp_MtpDevice\n");
|
||||
|
||||
clazz = env->FindClass("android/mtp/MtpDeviceInfo");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpDeviceInfo");
|
||||
return -1;
|
||||
}
|
||||
constructor_deviceInfo = env->GetMethodID(clazz, "<init>", "()V");
|
||||
if (constructor_deviceInfo == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpDeviceInfo constructor");
|
||||
return -1;
|
||||
}
|
||||
field_deviceInfo_manufacturer = env->GetFieldID(clazz, "mManufacturer", "Ljava/lang/String;");
|
||||
if (field_deviceInfo_manufacturer == NULL) {
|
||||
ALOGE("Can't find MtpDeviceInfo.mManufacturer");
|
||||
return -1;
|
||||
}
|
||||
field_deviceInfo_model = env->GetFieldID(clazz, "mModel", "Ljava/lang/String;");
|
||||
if (field_deviceInfo_model == NULL) {
|
||||
ALOGE("Can't find MtpDeviceInfo.mModel");
|
||||
return -1;
|
||||
}
|
||||
field_deviceInfo_version = env->GetFieldID(clazz, "mVersion", "Ljava/lang/String;");
|
||||
if (field_deviceInfo_version == NULL) {
|
||||
ALOGE("Can't find MtpDeviceInfo.mVersion");
|
||||
return -1;
|
||||
}
|
||||
field_deviceInfo_serialNumber = env->GetFieldID(clazz, "mSerialNumber", "Ljava/lang/String;");
|
||||
if (field_deviceInfo_serialNumber == NULL) {
|
||||
ALOGE("Can't find MtpDeviceInfo.mSerialNumber");
|
||||
return -1;
|
||||
}
|
||||
field_deviceInfo_operationsSupported = env->GetFieldID(clazz, "mOperationsSupported", "[I");
|
||||
if (field_deviceInfo_operationsSupported == NULL) {
|
||||
ALOGE("Can't find MtpDeviceInfo.mOperationsSupported");
|
||||
return -1;
|
||||
}
|
||||
field_deviceInfo_eventsSupported = env->GetFieldID(clazz, "mEventsSupported", "[I");
|
||||
if (field_deviceInfo_eventsSupported == NULL) {
|
||||
ALOGE("Can't find MtpDeviceInfo.mEventsSupported");
|
||||
return -1;
|
||||
}
|
||||
clazz_deviceInfo = (jclass)env->NewGlobalRef(clazz);
|
||||
|
||||
clazz = env->FindClass("android/mtp/MtpStorageInfo");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpStorageInfo");
|
||||
return -1;
|
||||
}
|
||||
constructor_storageInfo = env->GetMethodID(clazz, "<init>", "()V");
|
||||
if (constructor_storageInfo == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpStorageInfo constructor");
|
||||
return -1;
|
||||
}
|
||||
field_storageInfo_storageId = env->GetFieldID(clazz, "mStorageId", "I");
|
||||
if (field_storageInfo_storageId == NULL) {
|
||||
ALOGE("Can't find MtpStorageInfo.mStorageId");
|
||||
return -1;
|
||||
}
|
||||
field_storageInfo_maxCapacity = env->GetFieldID(clazz, "mMaxCapacity", "J");
|
||||
if (field_storageInfo_maxCapacity == NULL) {
|
||||
ALOGE("Can't find MtpStorageInfo.mMaxCapacity");
|
||||
return -1;
|
||||
}
|
||||
field_storageInfo_freeSpace = env->GetFieldID(clazz, "mFreeSpace", "J");
|
||||
if (field_storageInfo_freeSpace == NULL) {
|
||||
ALOGE("Can't find MtpStorageInfo.mFreeSpace");
|
||||
return -1;
|
||||
}
|
||||
field_storageInfo_description = env->GetFieldID(clazz, "mDescription", "Ljava/lang/String;");
|
||||
if (field_storageInfo_description == NULL) {
|
||||
ALOGE("Can't find MtpStorageInfo.mDescription");
|
||||
return -1;
|
||||
}
|
||||
field_storageInfo_volumeIdentifier = env->GetFieldID(clazz, "mVolumeIdentifier", "Ljava/lang/String;");
|
||||
if (field_storageInfo_volumeIdentifier == NULL) {
|
||||
ALOGE("Can't find MtpStorageInfo.mVolumeIdentifier");
|
||||
return -1;
|
||||
}
|
||||
clazz_storageInfo = (jclass)env->NewGlobalRef(clazz);
|
||||
|
||||
clazz = env->FindClass("android/mtp/MtpObjectInfo");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpObjectInfo");
|
||||
return -1;
|
||||
}
|
||||
constructor_objectInfo = env->GetMethodID(clazz, "<init>", "()V");
|
||||
if (constructor_objectInfo == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpObjectInfo constructor");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_handle = env->GetFieldID(clazz, "mHandle", "I");
|
||||
if (field_objectInfo_handle == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mHandle");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_storageId = env->GetFieldID(clazz, "mStorageId", "I");
|
||||
if (field_objectInfo_storageId == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mStorageId");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_format = env->GetFieldID(clazz, "mFormat", "I");
|
||||
if (field_objectInfo_format == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mFormat");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_protectionStatus = env->GetFieldID(clazz, "mProtectionStatus", "I");
|
||||
if (field_objectInfo_protectionStatus == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mProtectionStatus");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_compressedSize = env->GetFieldID(clazz, "mCompressedSize", "I");
|
||||
if (field_objectInfo_compressedSize == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mCompressedSize");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_thumbFormat = env->GetFieldID(clazz, "mThumbFormat", "I");
|
||||
if (field_objectInfo_thumbFormat == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mThumbFormat");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_thumbCompressedSize = env->GetFieldID(clazz, "mThumbCompressedSize", "I");
|
||||
if (field_objectInfo_thumbCompressedSize == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mThumbCompressedSize");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_thumbPixWidth = env->GetFieldID(clazz, "mThumbPixWidth", "I");
|
||||
if (field_objectInfo_thumbPixWidth == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mThumbPixWidth");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_thumbPixHeight = env->GetFieldID(clazz, "mThumbPixHeight", "I");
|
||||
if (field_objectInfo_thumbPixHeight == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mThumbPixHeight");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_imagePixWidth = env->GetFieldID(clazz, "mImagePixWidth", "I");
|
||||
if (field_objectInfo_imagePixWidth == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mImagePixWidth");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_imagePixHeight = env->GetFieldID(clazz, "mImagePixHeight", "I");
|
||||
if (field_objectInfo_imagePixHeight == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mImagePixHeight");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_imagePixDepth = env->GetFieldID(clazz, "mImagePixDepth", "I");
|
||||
if (field_objectInfo_imagePixDepth == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mImagePixDepth");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_parent = env->GetFieldID(clazz, "mParent", "I");
|
||||
if (field_objectInfo_parent == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mParent");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_associationType = env->GetFieldID(clazz, "mAssociationType", "I");
|
||||
if (field_objectInfo_associationType == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mAssociationType");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_associationDesc = env->GetFieldID(clazz, "mAssociationDesc", "I");
|
||||
if (field_objectInfo_associationDesc == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mAssociationDesc");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_sequenceNumber = env->GetFieldID(clazz, "mSequenceNumber", "I");
|
||||
if (field_objectInfo_sequenceNumber == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mSequenceNumber");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_name = env->GetFieldID(clazz, "mName", "Ljava/lang/String;");
|
||||
if (field_objectInfo_name == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mName");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_dateCreated = env->GetFieldID(clazz, "mDateCreated", "J");
|
||||
if (field_objectInfo_dateCreated == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mDateCreated");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_dateModified = env->GetFieldID(clazz, "mDateModified", "J");
|
||||
if (field_objectInfo_dateModified == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mDateModified");
|
||||
return -1;
|
||||
}
|
||||
field_objectInfo_keywords = env->GetFieldID(clazz, "mKeywords", "Ljava/lang/String;");
|
||||
if (field_objectInfo_keywords == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mKeywords");
|
||||
return -1;
|
||||
}
|
||||
clazz_objectInfo = (jclass)env->NewGlobalRef(clazz);
|
||||
|
||||
clazz = env->FindClass("android/mtp/MtpEvent");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpEvent");
|
||||
return -1;
|
||||
}
|
||||
constructor_event = env->GetMethodID(clazz, "<init>", "()V");
|
||||
if (constructor_event == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpEvent constructor");
|
||||
return -1;
|
||||
}
|
||||
field_event_eventCode = env->GetFieldID(clazz, "mEventCode", "I");
|
||||
if (field_event_eventCode == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mEventCode");
|
||||
return -1;
|
||||
}
|
||||
field_event_parameter1 = env->GetFieldID(clazz, "mParameter1", "I");
|
||||
if (field_event_parameter1 == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mParameter1");
|
||||
return -1;
|
||||
}
|
||||
field_event_parameter2 = env->GetFieldID(clazz, "mParameter2", "I");
|
||||
if (field_event_parameter2 == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mParameter2");
|
||||
return -1;
|
||||
}
|
||||
field_event_parameter3 = env->GetFieldID(clazz, "mParameter3", "I");
|
||||
if (field_event_parameter3 == NULL) {
|
||||
ALOGE("Can't find MtpObjectInfo.mParameter3");
|
||||
return -1;
|
||||
}
|
||||
clazz_event = (jclass)env->NewGlobalRef(clazz);
|
||||
|
||||
clazz = env->FindClass("android/mtp/MtpDevice");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpDevice");
|
||||
return -1;
|
||||
}
|
||||
field_context = env->GetFieldID(clazz, "mNativeContext", "J");
|
||||
if (field_context == NULL) {
|
||||
ALOGE("Can't find MtpDevice.mNativeContext");
|
||||
return -1;
|
||||
}
|
||||
clazz = env->FindClass("java/io/IOException");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find java.io.IOException");
|
||||
return -1;
|
||||
}
|
||||
clazz_io_exception = (jclass)env->NewGlobalRef(clazz);
|
||||
clazz = env->FindClass("android/os/OperationCanceledException");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find android.os.OperationCanceledException");
|
||||
return -1;
|
||||
}
|
||||
clazz_operation_canceled_exception = (jclass)env->NewGlobalRef(clazz);
|
||||
|
||||
return AndroidRuntime::registerNativeMethods(env,
|
||||
"android/mtp/MtpDevice", gMethods, NELEM(gMethods));
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <utils/threads.h>
|
||||
|
||||
#include "core_jni_helpers.h"
|
||||
#include "jni.h"
|
||||
#include <nativehelper/JNIPlatformHelp.h>
|
||||
#include "android_runtime/AndroidRuntime.h"
|
||||
@@ -34,6 +35,8 @@
|
||||
|
||||
using namespace android;
|
||||
|
||||
static Mutex sMutex;
|
||||
|
||||
// MtpServer fields
|
||||
static jfieldID field_MtpServer_nativeContext;
|
||||
|
||||
@@ -44,7 +47,25 @@ static jfieldID field_MtpStorage_description;
|
||||
static jfieldID field_MtpStorage_removable;
|
||||
static jfieldID field_MtpStorage_maxFileSize;
|
||||
|
||||
static Mutex sMutex;
|
||||
// Initializer for the jfieldIDs above. This method must be invoked before accessing MtpServer and
|
||||
// MtpStorage fields.
|
||||
static void initializeJavaIDs(JNIEnv* env) {
|
||||
static std::once_flag sJniInitialized;
|
||||
|
||||
std::call_once(sJniInitialized, [](JNIEnv *env) {
|
||||
const jclass storage_clazz = FindClassOrDie(env, "android/mtp/MtpStorage");
|
||||
field_MtpStorage_storageId = GetFieldIDOrDie(env, storage_clazz, "mStorageId", "I");
|
||||
field_MtpStorage_path =
|
||||
GetFieldIDOrDie(env, storage_clazz, "mPath", "Ljava/lang/String;");
|
||||
field_MtpStorage_description =
|
||||
GetFieldIDOrDie(env, storage_clazz, "mDescription", "Ljava/lang/String;");
|
||||
field_MtpStorage_removable = GetFieldIDOrDie(env, storage_clazz, "mRemovable", "Z");
|
||||
field_MtpStorage_maxFileSize = GetFieldIDOrDie(env, storage_clazz, "mMaxFileSize", "J");
|
||||
|
||||
const jclass server_clazz = FindClassOrDie(env, "android/mtp/MtpServer");
|
||||
field_MtpServer_nativeContext = GetFieldIDOrDie(env, server_clazz, "mNativeContext", "J");
|
||||
}, env);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
@@ -52,6 +73,7 @@ static Mutex sMutex;
|
||||
extern IMtpDatabase* getMtpDatabase(JNIEnv *env, jobject database);
|
||||
|
||||
static inline MtpServer* getMtpServer(JNIEnv *env, jobject thiz) {
|
||||
initializeJavaIDs(env);
|
||||
return (MtpServer*)env->GetLongField(thiz, field_MtpServer_nativeContext);
|
||||
}
|
||||
|
||||
@@ -60,6 +82,8 @@ android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, job
|
||||
jboolean usePtp, jstring deviceInfoManufacturer, jstring deviceInfoModel,
|
||||
jstring deviceInfoDeviceVersion, jstring deviceInfoSerialNumber)
|
||||
{
|
||||
initializeJavaIDs(env);
|
||||
|
||||
const char *deviceInfoManufacturerStr = env->GetStringUTFChars(deviceInfoManufacturer, NULL);
|
||||
const char *deviceInfoModelStr = env->GetStringUTFChars(deviceInfoModel, NULL);
|
||||
const char *deviceInfoDeviceVersionStr = env->GetStringUTFChars(deviceInfoDeviceVersion, NULL);
|
||||
@@ -224,50 +248,6 @@ static const JNINativeMethod gMethods[] = {
|
||||
|
||||
int register_android_mtp_MtpServer(JNIEnv *env)
|
||||
{
|
||||
jclass clazz;
|
||||
|
||||
clazz = env->FindClass("android/mtp/MtpStorage");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpStorage");
|
||||
return -1;
|
||||
}
|
||||
field_MtpStorage_storageId = env->GetFieldID(clazz, "mStorageId", "I");
|
||||
if (field_MtpStorage_storageId == NULL) {
|
||||
ALOGE("Can't find MtpStorage.mStorageId");
|
||||
return -1;
|
||||
}
|
||||
field_MtpStorage_path = env->GetFieldID(clazz, "mPath", "Ljava/lang/String;");
|
||||
if (field_MtpStorage_path == NULL) {
|
||||
ALOGE("Can't find MtpStorage.mPath");
|
||||
return -1;
|
||||
}
|
||||
field_MtpStorage_description = env->GetFieldID(clazz, "mDescription", "Ljava/lang/String;");
|
||||
if (field_MtpStorage_description == NULL) {
|
||||
ALOGE("Can't find MtpStorage.mDescription");
|
||||
return -1;
|
||||
}
|
||||
field_MtpStorage_removable = env->GetFieldID(clazz, "mRemovable", "Z");
|
||||
if (field_MtpStorage_removable == NULL) {
|
||||
ALOGE("Can't find MtpStorage.mRemovable");
|
||||
return -1;
|
||||
}
|
||||
field_MtpStorage_maxFileSize = env->GetFieldID(clazz, "mMaxFileSize", "J");
|
||||
if (field_MtpStorage_maxFileSize == NULL) {
|
||||
ALOGE("Can't find MtpStorage.mMaxFileSize");
|
||||
return -1;
|
||||
}
|
||||
|
||||
clazz = env->FindClass("android/mtp/MtpServer");
|
||||
if (clazz == NULL) {
|
||||
ALOGE("Can't find android/mtp/MtpServer");
|
||||
return -1;
|
||||
}
|
||||
field_MtpServer_nativeContext = env->GetFieldID(clazz, "mNativeContext", "J");
|
||||
if (field_MtpServer_nativeContext == NULL) {
|
||||
ALOGE("Can't find MtpServer.mNativeContext");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return AndroidRuntime::registerNativeMethods(env,
|
||||
"android/mtp/MtpServer", gMethods, NELEM(gMethods));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user