/* * Copyright 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__)) #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__)) #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__)) namespace ndk_helper { /****************************************************************** * Helper functions for JNI calls * This class wraps JNI calls and provides handy interface calling commonly used features * in Java SDK. * Such as * - loading graphics files (e.g. PNG, JPG) * - character code conversion * - retrieving system properties which only supported in Java SDK * * NOTE: To use this class, add NDKHelper.java as a corresponding helpers in Java code */ class JNIHelper { private: std::string app_name_; ANativeActivity* activity_; jobject jni_helper_java_ref_; jclass jni_helper_java_class_; //mutex for synchronization //This class uses singleton pattern and can be invoked from multiple threads, //each methods locks the mutex for a thread safety mutable pthread_mutex_t mutex_; jstring GetExternalFilesDirJString( JNIEnv *env ); jclass RetrieveClass( JNIEnv *jni, const char* class_name ); JNIHelper(); ~JNIHelper(); JNIHelper( const JNIHelper& rhs ); JNIHelper& operator=( const JNIHelper& rhs ); public: /* * To load your own Java classes, JNIHelper requires to be initialized with a ANativeActivity handle. * This methods need to be called before any call to the helper class. * Static member of the class * * arguments: * in: activity, pointer to ANativeActivity. Used internally to set up JNI environment * in: helper_class_name, pointer to Java side helper class name. (e.g. "com/sample/helper/NDKHelper" in samples ) */ static void Init( ANativeActivity* activity, const char* helper_class_name ); /* * Retrieve the singleton object of the helper. * Static member of the class * Methods in the class are designed as thread safe. */ static JNIHelper* GetInstance(); /* * Read a file from a strorage. * First, the method tries to read the file from an external storage. * If it fails to read, it falls back to use assset manager and try to read the file from APK asset. * * arguments: * in: file_name, file name to read * out: buffer_ref, pointer to a vector buffer to read a file. * when the call succeeded, the buffer includes contents of specified file * when the call failed, contents of the buffer remains same * return: * true when file read succeeded * false when it failed to read the file */ bool ReadFile( const char* file_name, std::vector* buffer_ref ); /* * Load and create OpenGL texture from given file name. * The method invokes BitmapFactory in Java so it can read jpeg/png formatted files * * The methods creates mip-map and set texture parameters like this, * glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST ); * glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); * glGenerateMipmap( GL_TEXTURE_2D ); * * arguments: * in: file_name, file name to read, PNG&JPG is supported * return: * OpenGL texture name when the call succeeded * When it failed to load the texture, it returns -1 */ uint32_t LoadTexture( const char* file_name ); /* * Convert string from character code other than UTF-8 * * arguments: * in: str, pointer to a string which is encoded other than UTF-8 * in: encoding, pointer to a character encoding string. * The encoding string can be any valid java.nio.charset.Charset name * e.g. "UTF-16", "Shift_JIS" * return: converted input string as an UTF-8 std::string */ std::string ConvertString( const char* str, const char* encode ); /* * Retrieve external file directory through JNI call * * return: std::string containing external file diretory */ std::string GetExternalFilesDir(); /* * Audio helper * Retrieves native audio buffer size which is required to achieve low latency audio * * return: Native audio buffer size which is a hint to achieve low latency audio * If the API is not supported (API level < 17), it returns 0 */ int32_t GetNativeAudioBufferSize(); /* * Audio helper * Retrieves native audio sample rate which is required to achieve low latency audio * * return: Native audio sample rate which is a hint to achieve low latency audio */ int32_t GetNativeAudioSampleRate(); /* * Retrieves application bundle name * * return: pointer to an app name string * */ const char* GetAppName() { return app_name_.c_str(); } }; } //namespace ndkHelper