Snap for 6001391 from fcb38946a79ccfde12654834e936f0dee2c73350 to qt-aml-resolv-release
Change-Id: Idb91a554fc5dda37e4d1bab3c8e6ed1bd87f86db
diff --git a/ALog-priv.h b/ALog-priv.h
index 5e24fc8..ca132d9 100644
--- a/ALog-priv.h
+++ b/ALog-priv.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef NATIVEHELPER_ALOGPRIV_H_
-#define NATIVEHELPER_ALOGPRIV_H_
+#ifndef LIBNATIVEHELPER_ALOG_PRIV_H_
+#define LIBNATIVEHELPER_ALOG_PRIV_H_
#include <android/log.h>
@@ -73,4 +73,4 @@
if (cond) __android_log_assert(#cond, LOG_TAG, __VA_ARGS__)
#endif
-#endif // NATIVEHELPER_ALOGPRIV_H_
+#endif // LIBNATIVEHELPER_ALOG_PRIV_H_
diff --git a/JNIHelp.cpp b/JNIHelp.cpp
index 8432f7a..b57ec50 100644
--- a/JNIHelp.cpp
+++ b/JNIHelp.cpp
@@ -14,22 +14,23 @@
* limitations under the License.
*/
-#define LOG_TAG "JNIHelp"
-
#include "nativehelper/JNIHelp.h"
-#include "ALog-priv.h"
-
#include <string>
+#define LOG_TAG "JNIHelp"
+#include "ALog-priv.h"
+
+#include "jni.h"
#include "JniConstants.h"
-#include "nativehelper/ScopedLocalRef.h"
+
+namespace {
/**
* Equivalent to ScopedLocalRef, but for C_JNIEnv instead. (And slightly more powerful.)
*/
template<typename T>
-class scoped_local_ref {
+class scoped_local_ref final {
public:
explicit scoped_local_ref(C_JNIEnv* env, T localRef = NULL)
: mEnv(env), mLocalRef(localRef)
@@ -52,42 +53,28 @@
}
private:
+ // scoped_local_ref does not support copy or move semantics.
+ scoped_local_ref(const scoped_local_ref&) = delete;
+ scoped_local_ref(scoped_local_ref&&) = delete;
+ scoped_local_ref& operator=(const scoped_local_ref&) = delete;
+ scoped_local_ref& operator=(scoped_local_ref&&) = delete;
+
+private:
C_JNIEnv* const mEnv;
T mLocalRef;
-
- DISALLOW_COPY_AND_ASSIGN(scoped_local_ref);
};
-static jclass findClass(C_JNIEnv* env, const char* className) {
+jclass findClass(C_JNIEnv* env, const char* className) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
return (*env)->FindClass(e, className);
}
-MODULE_API int jniRegisterNativeMethods(C_JNIEnv* env, const char* className,
- const JNINativeMethod* gMethods, int numMethods)
-{
- JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-
- ALOGV("Registering %s's %d native methods...", className, numMethods);
-
- scoped_local_ref<jclass> c(env, findClass(env, className));
- ALOG_ALWAYS_FATAL_IF(c.get() == NULL,
- "Native registration unable to find class '%s'; aborting...",
- className);
-
- int result = e->RegisterNatives(c.get(), gMethods, numMethods);
- ALOG_ALWAYS_FATAL_IF(result < 0, "RegisterNatives failed for '%s'; aborting...",
- className);
-
- return 0;
-}
-
/*
* Returns a human-readable summary of an exception object. The buffer will
* be populated with the "binary" class name and, if present, the
* exception message.
*/
-static bool getExceptionSummary(C_JNIEnv* env, jthrowable exception, std::string& result) {
+bool getExceptionSummary(C_JNIEnv* env, jthrowable exception, std::string& result) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
/* get the name of the exception's class */
@@ -138,7 +125,7 @@
/*
* Returns an exception (with stack trace) as a string.
*/
-static bool getStackTrace(C_JNIEnv* env, jthrowable exception, std::string& result) {
+bool getStackTrace(C_JNIEnv* env, jthrowable exception, std::string& result) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
scoped_local_ref<jclass> stringWriterClass(env, findClass(env, "java/io/StringWriter"));
@@ -196,7 +183,81 @@
return true;
}
-MODULE_API int jniThrowException(C_JNIEnv* env, const char* className, const char* msg) {
+std::string jniGetStackTrace(C_JNIEnv* env, jthrowable exception) {
+ JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
+
+ scoped_local_ref<jthrowable> currentException(env, (*env)->ExceptionOccurred(e));
+ if (exception == NULL) {
+ exception = currentException.get();
+ if (exception == NULL) {
+ return "<no pending exception>";
+ }
+ }
+
+ if (currentException.get() != NULL) {
+ (*env)->ExceptionClear(e);
+ }
+
+ std::string trace;
+ if (!getStackTrace(env, exception, trace)) {
+ (*env)->ExceptionClear(e);
+ getExceptionSummary(env, exception, trace);
+ }
+
+ if (currentException.get() != NULL) {
+ (*env)->Throw(e, currentException.get()); // rethrow
+ }
+
+ return trace;
+}
+
+// Note: glibc has a nonstandard strerror_r that returns char* rather than POSIX's int.
+// char *strerror_r(int errnum, char *buf, size_t n);
+//
+// Some versions of bionic support the glibc style call. Since the set of defines that determine
+// which version is used is byzantine in its complexity we will just use this C++ template hack to
+// select the correct jniStrError implementation based on the libc being used.
+
+using GNUStrError = char* (*)(int,char*,size_t);
+using POSIXStrError = int (*)(int,char*,size_t);
+
+inline const char* realJniStrError(GNUStrError func, int errnum, char* buf, size_t buflen) {
+ return func(errnum, buf, buflen);
+}
+
+inline const char* realJniStrError(POSIXStrError func, int errnum, char* buf, size_t buflen) {
+ int rc = func(errnum, buf, buflen);
+ if (rc != 0) {
+ // (POSIX only guarantees a value other than 0. The safest
+ // way to implement this function is to use C++ and overload on the
+ // type of strerror_r to accurately distinguish GNU from POSIX.)
+ snprintf(buf, buflen, "errno %d", errnum);
+ }
+ return buf;
+}
+
+} // namespace
+
+int jniRegisterNativeMethods(C_JNIEnv* env, const char* className,
+ const JNINativeMethod* gMethods, int numMethods)
+{
+ JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
+
+ ALOGV("Registering %s's %d native methods...", className, numMethods);
+
+ scoped_local_ref<jclass> c(env, findClass(env, className));
+ ALOG_ALWAYS_FATAL_IF(c.get() == NULL,
+ "Native registration unable to find class '%s'; aborting...",
+ className);
+
+ int result = e->RegisterNatives(c.get(), gMethods, numMethods);
+ ALOG_ALWAYS_FATAL_IF(result < 0, "RegisterNatives failed for '%s'; aborting...",
+ className);
+
+ return 0;
+}
+
+int jniThrowException(C_JNIEnv* env, const char* className, const char* msg) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
if ((*env)->ExceptionCheck(e)) {
@@ -227,99 +288,43 @@
return 0;
}
-MODULE_API int jniThrowExceptionFmt(C_JNIEnv* env, const char* className, const char* fmt, va_list args) {
+int jniThrowExceptionFmt(C_JNIEnv* env, const char* className, const char* fmt, va_list args) {
char msgBuf[512];
vsnprintf(msgBuf, sizeof(msgBuf), fmt, args);
return jniThrowException(env, className, msgBuf);
}
-MODULE_API int jniThrowNullPointerException(C_JNIEnv* env, const char* msg) {
+int jniThrowNullPointerException(C_JNIEnv* env, const char* msg) {
return jniThrowException(env, "java/lang/NullPointerException", msg);
}
-MODULE_API int jniThrowRuntimeException(C_JNIEnv* env, const char* msg) {
+int jniThrowRuntimeException(C_JNIEnv* env, const char* msg) {
return jniThrowException(env, "java/lang/RuntimeException", msg);
}
-MODULE_API int jniThrowIOException(C_JNIEnv* env, int errnum) {
+int jniThrowIOException(C_JNIEnv* env, int errnum) {
char buffer[80];
const char* message = jniStrError(errnum, buffer, sizeof(buffer));
return jniThrowException(env, "java/io/IOException", message);
}
-static std::string jniGetStackTrace(C_JNIEnv* env, jthrowable exception) {
- JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-
- scoped_local_ref<jthrowable> currentException(env, (*env)->ExceptionOccurred(e));
- if (exception == NULL) {
- exception = currentException.get();
- if (exception == NULL) {
- return "<no pending exception>";
- }
- }
-
- if (currentException.get() != NULL) {
- (*env)->ExceptionClear(e);
- }
-
- std::string trace;
- if (!getStackTrace(env, exception, trace)) {
- (*env)->ExceptionClear(e);
- getExceptionSummary(env, exception, trace);
- }
-
- if (currentException.get() != NULL) {
- (*env)->Throw(e, currentException.get()); // rethrow
- }
-
- return trace;
-}
-
-MODULE_API void jniLogException(C_JNIEnv* env, int priority, const char* tag, jthrowable exception) {
+void jniLogException(C_JNIEnv* env, int priority, const char* tag, jthrowable exception) {
std::string trace(jniGetStackTrace(env, exception));
__android_log_write(priority, tag, trace.c_str());
}
-// Note: glibc has a nonstandard strerror_r that returns char* rather than POSIX's int.
-// char *strerror_r(int errnum, char *buf, size_t n);
-//
-// Some versions of bionic support the glibc style call. Since the set of defines that determine
-// which version is used is byzantine in its complexity we will just use this C++ template hack to
-// select the correct jniStrError implementation based on the libc being used.
-namespace impl {
-
-using GNUStrError = char* (*)(int,char*,size_t);
-using POSIXStrError = int (*)(int,char*,size_t);
-
-inline const char* realJniStrError(GNUStrError func, int errnum, char* buf, size_t buflen) {
- return func(errnum, buf, buflen);
-}
-
-inline const char* realJniStrError(POSIXStrError func, int errnum, char* buf, size_t buflen) {
- int rc = func(errnum, buf, buflen);
- if (rc != 0) {
- // (POSIX only guarantees a value other than 0. The safest
- // way to implement this function is to use C++ and overload on the
- // type of strerror_r to accurately distinguish GNU from POSIX.)
- snprintf(buf, buflen, "errno %d", errnum);
- }
- return buf;
-}
-
-} // namespace impl
-
-MODULE_API const char* jniStrError(int errnum, char* buf, size_t buflen) {
+const char* jniStrError(int errnum, char* buf, size_t buflen) {
#ifdef _WIN32
strerror_s(buf, buflen, errnum);
return buf;
#else
// The magic of C++ overloading selects the correct implementation based on the declared type of
// strerror_r. The inline will ensure that we don't have any indirect calls.
- return impl::realJniStrError(strerror_r, errnum, buf, buflen);
+ return realJniStrError(strerror_r, errnum, buf, buflen);
#endif
}
-MODULE_API jobject jniCreateFileDescriptor(C_JNIEnv* env, int fd) {
+jobject jniCreateFileDescriptor(C_JNIEnv* env, int fd) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
jobject fileDescriptor = e->NewObject(JniConstants::GetFileDescriptorClass(e),
JniConstants::GetFileDescriptorInitMethod(e));
@@ -331,7 +336,7 @@
return fileDescriptor;
}
-MODULE_API int jniGetFDFromFileDescriptor(C_JNIEnv* env, jobject fileDescriptor) {
+int jniGetFDFromFileDescriptor(C_JNIEnv* env, jobject fileDescriptor) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
if (fileDescriptor != nullptr) {
return e->GetIntField(fileDescriptor,
@@ -341,7 +346,7 @@
}
}
-MODULE_API void jniSetFileDescriptorOfFD(C_JNIEnv* env, jobject fileDescriptor, int value) {
+void jniSetFileDescriptorOfFD(C_JNIEnv* env, jobject fileDescriptor, int value) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
if (fileDescriptor == nullptr) {
jniThrowNullPointerException(e, "null FileDescriptor");
@@ -350,12 +355,12 @@
}
}
-MODULE_API jlong jniGetOwnerIdFromFileDescriptor(C_JNIEnv* env, jobject fileDescriptor) {
+jlong jniGetOwnerIdFromFileDescriptor(C_JNIEnv* env, jobject fileDescriptor) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
return e->GetLongField(fileDescriptor, JniConstants::GetFileDescriptorOwnerIdField(e));
}
-MODULE_API jarray jniGetNioBufferBaseArray(C_JNIEnv* env, jobject nioBuffer) {
+jarray jniGetNioBufferBaseArray(C_JNIEnv* env, jobject nioBuffer) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
jclass nioAccessClass = JniConstants::GetNioAccessClass(e);
jmethodID getBaseArrayMethod = JniConstants::GetNioAccessGetBaseArrayMethod(e);
@@ -363,14 +368,14 @@
return static_cast<jarray>(object);
}
-MODULE_API int jniGetNioBufferBaseArrayOffset(C_JNIEnv* env, jobject nioBuffer) {
+int jniGetNioBufferBaseArrayOffset(C_JNIEnv* env, jobject nioBuffer) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
jclass nioAccessClass = JniConstants::GetNioAccessClass(e);
jmethodID getBaseArrayOffsetMethod = JniConstants::GetNioAccessGetBaseArrayOffsetMethod(e);
return e->CallStaticIntMethod(nioAccessClass, getBaseArrayOffsetMethod, nioBuffer);
}
-MODULE_API jlong jniGetNioBufferPointer(C_JNIEnv* env, jobject nioBuffer) {
+jlong jniGetNioBufferPointer(C_JNIEnv* env, jobject nioBuffer) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
jlong baseAddress = e->GetLongField(nioBuffer, JniConstants::GetNioBufferAddressField(e));
if (baseAddress != 0) {
@@ -382,8 +387,8 @@
return baseAddress;
}
-MODULE_API jlong jniGetNioBufferFields(C_JNIEnv* env, jobject nioBuffer,
- jint* position, jint* limit, jint* elementSizeShift) {
+jlong jniGetNioBufferFields(C_JNIEnv* env, jobject nioBuffer,
+ jint* position, jint* limit, jint* elementSizeShift) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
*position = e->GetIntField(nioBuffer, JniConstants::GetNioBufferPositionField(e));
*limit = e->GetIntField(nioBuffer, JniConstants::GetNioBufferLimitField(e));
@@ -392,16 +397,16 @@
return e->GetLongField(nioBuffer, JniConstants::GetNioBufferAddressField(e));
}
-MODULE_API jobject jniGetReferent(C_JNIEnv* env, jobject ref) {
+jobject jniGetReferent(C_JNIEnv* env, jobject ref) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
return e->CallObjectMethod(ref, JniConstants::GetReferenceGetMethod(e));
}
-MODULE_API jstring jniCreateString(C_JNIEnv* env, const jchar* unicodeChars, jsize len) {
+jstring jniCreateString(C_JNIEnv* env, const jchar* unicodeChars, jsize len) {
JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
return e->NewString(unicodeChars, len);
}
-MODULE_API void jniUninitializeConstants() {
+void jniUninitializeConstants() {
JniConstants::Uninitialize();
}
diff --git a/JniConstants.h b/JniConstants.h
index b2d03be..2a637a1 100644
--- a/JniConstants.h
+++ b/JniConstants.h
@@ -14,7 +14,8 @@
* limitations under the License.
*/
-#pragma once
+#ifndef LIBNATIVEHELPER_JNICONSTANTS_H_
+#define LIBNATIVEHELPER_JNICONSTANTS_H_
#include "jni.h"
@@ -81,3 +82,5 @@
// one reason why there is a limit of VM instance per process.
static void Uninitialize();
};
+
+#endif // LIBNATIVEHELPER_JNICONSTANTS_H_
diff --git a/JniInvocation.cpp b/JniInvocation.cpp
index 6d992e6..dc55d81 100644
--- a/JniInvocation.cpp
+++ b/JniInvocation.cpp
@@ -112,8 +112,6 @@
bool Init(const char* library);
- // static const char* GetLibrary(const char* library, char* buffer);
-
static const char* GetLibrary(const char* library,
char* buffer,
bool (*is_debuggable)() = IsDebuggable,
@@ -281,11 +279,11 @@
return *jni_invocation_;
}
-MODULE_API jint JNI_GetDefaultJavaVMInitArgs(void* vm_args) {
+jint JNI_GetDefaultJavaVMInitArgs(void* vm_args) {
return JniInvocationImpl::GetJniInvocation().JNI_GetDefaultJavaVMInitArgs(vm_args);
}
-MODULE_API jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) {
+jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) {
// Ensure any cached heap objects from previous VM instances are
// invalidated. There is no notification here that a VM is destroyed. These
// cached objects limit us to one VM instance per process.
@@ -293,29 +291,29 @@
return JniInvocationImpl::GetJniInvocation().JNI_CreateJavaVM(p_vm, p_env, vm_args);
}
-MODULE_API jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize size, jsize* vm_count) {
+jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize size, jsize* vm_count) {
return JniInvocationImpl::GetJniInvocation().JNI_GetCreatedJavaVMs(vms, size, vm_count);
}
-MODULE_API JniInvocationImpl* JniInvocationCreate() {
+const char* JniInvocation::GetLibrary(const char* library,
+ char* buffer,
+ bool (*is_debuggable)(),
+ int (*get_library_system_property)(char* buffer)) {
+ return JniInvocationImpl::GetLibrary(library, buffer, is_debuggable, get_library_system_property);
+}
+
+JniInvocationImpl* JniInvocationCreate() {
return new JniInvocationImpl();
}
-MODULE_API void JniInvocationDestroy(JniInvocationImpl* instance) {
+void JniInvocationDestroy(JniInvocationImpl* instance) {
delete instance;
}
-MODULE_API int JniInvocationInit(JniInvocationImpl* instance, const char* library) {
+int JniInvocationInit(JniInvocationImpl* instance, const char* library) {
return instance->Init(library) ? 1 : 0;
}
-MODULE_API const char* JniInvocationGetLibrary(const char* library, char* buffer) {
+const char* JniInvocationGetLibrary(const char* library, char* buffer) {
return JniInvocationImpl::GetLibrary(library, buffer);
}
-
-MODULE_API const char* JniInvocation::GetLibrary(const char* library,
- char* buffer,
- bool (*is_debuggable)(),
- int (*get_library_system_property)(char* buffer)) {
- return JniInvocationImpl::GetLibrary(library, buffer, is_debuggable, get_library_system_property);
-}
diff --git a/header_only_include/nativehelper/nativehelper_utils.h b/header_only_include/nativehelper/nativehelper_utils.h
index d7289f9..2cf7b96 100644
--- a/header_only_include/nativehelper/nativehelper_utils.h
+++ b/header_only_include/nativehelper/nativehelper_utils.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef NATIVEHELPER_MACROS_H_
-#define NATIVEHELPER_MACROS_H_
+#ifndef LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_NATIVEHELPER_UTILS_H_
+#define LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_NATIVEHELPER_UTILS_H_
#if defined(__cplusplus)
@@ -27,9 +27,8 @@
void operator=(const TypeName&) = delete
#endif // !defined(DISALLOW_COPY_AND_ASSIGN)
-#ifndef NATIVEHELPER_JNIHELP_H_
// This seems a header-only include. Provide NPE throwing.
-static inline int jniThrowNullPointerException(JNIEnv* env, const char* msg) {
+static inline int jniThrowNullPointerException(JNIEnv* env) {
if (env->ExceptionCheck()) {
// Drop any pending exception.
env->ExceptionClear();
@@ -40,7 +39,7 @@
return -1;
}
- if (env->ThrowNew(e_class, msg) != JNI_OK) {
+ if (env->ThrowNew(e_class, nullptr) != JNI_OK) {
env->DeleteLocalRef(e_class);
return -1;
}
@@ -48,8 +47,7 @@
env->DeleteLocalRef(e_class);
return 0;
}
-#endif // NATIVEHELPER_JNIHELP_H_
#endif // defined(__cplusplus)
-#endif // NATIVEHELPER_MACROS_H_
+#endif // LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_NATIVEHELPER_UTILS_H_
diff --git a/header_only_include/nativehelper/scoped_bytes.h b/header_only_include/nativehelper/scoped_bytes.h
index f53931e..1806d37 100644
--- a/header_only_include/nativehelper/scoped_bytes.h
+++ b/header_only_include/nativehelper/scoped_bytes.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SCOPED_BYTES_H_
-#define SCOPED_BYTES_H_
+#ifndef LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_BYTES_H_
+#define LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_BYTES_H_
#include "jni.h"
#include "nativehelper_utils.h"
@@ -33,7 +33,7 @@
: mEnv(env), mObject(object), mByteArray(NULL), mPtr(NULL)
{
if (mObject == NULL) {
- jniThrowNullPointerException(mEnv, NULL);
+ jniThrowNullPointerException(mEnv);
} else {
jclass byteArrayClass = env->FindClass("[B");
if (mEnv->IsInstanceOf(mObject, byteArrayClass)) {
@@ -80,4 +80,4 @@
}
};
-#endif // SCOPED_BYTES_H_
+#endif // LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_BYTES_H_
diff --git a/header_only_include/nativehelper/scoped_local_frame.h b/header_only_include/nativehelper/scoped_local_frame.h
index 91180fe..0222014 100644
--- a/header_only_include/nativehelper/scoped_local_frame.h
+++ b/header_only_include/nativehelper/scoped_local_frame.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SCOPED_LOCAL_FRAME_H_
-#define SCOPED_LOCAL_FRAME_H_
+#ifndef LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_LOCAL_FRAME_H_
+#define LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_LOCAL_FRAME_H_
#include "jni.h"
#include "nativehelper_utils.h"
@@ -36,4 +36,4 @@
DISALLOW_COPY_AND_ASSIGN(ScopedLocalFrame);
};
-#endif // SCOPED_LOCAL_FRAME_H_
+#endif // LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_LOCAL_FRAME_H_
diff --git a/header_only_include/nativehelper/scoped_local_ref.h b/header_only_include/nativehelper/scoped_local_ref.h
index 3eb21d9..11e1043 100644
--- a/header_only_include/nativehelper/scoped_local_ref.h
+++ b/header_only_include/nativehelper/scoped_local_ref.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SCOPED_LOCAL_REF_H_
-#define SCOPED_LOCAL_REF_H_
+#ifndef LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_LOCAL_REF_H_
+#define LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_LOCAL_REF_H_
#include <cstddef>
@@ -88,4 +88,4 @@
DISALLOW_COPY_AND_ASSIGN(ScopedLocalRef);
};
-#endif // SCOPED_LOCAL_REF_H_
+#endif // LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_LOCAL_REF_H_
diff --git a/header_only_include/nativehelper/scoped_primitive_array.h b/header_only_include/nativehelper/scoped_primitive_array.h
index d6840c2..185177a 100644
--- a/header_only_include/nativehelper/scoped_primitive_array.h
+++ b/header_only_include/nativehelper/scoped_primitive_array.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SCOPED_PRIMITIVE_ARRAY_H_
-#define SCOPED_PRIMITIVE_ARRAY_H_
+#ifndef LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_PRIMITIVE_ARRAY_H_
+#define LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_PRIMITIVE_ARRAY_H_
#include "jni.h"
#include "nativehelper_utils.h"
@@ -47,7 +47,7 @@
mJavaArray = NULL; \
mSize = 0; \
mRawArray = NULL; \
- jniThrowNullPointerException(mEnv, NULL); \
+ jniThrowNullPointerException(mEnv); \
} else { \
reset(javaArray); \
} \
@@ -104,7 +104,7 @@
Scoped ## NAME ## ArrayRW(JNIEnv* env, PRIMITIVE_TYPE ## Array javaArray) \
: mEnv(env), mJavaArray(javaArray), mRawArray(NULL) { \
if (mJavaArray == NULL) { \
- jniThrowNullPointerException(mEnv, NULL); \
+ jniThrowNullPointerException(mEnv); \
} else { \
mRawArray = mEnv->Get ## NAME ## ArrayElements(mJavaArray, NULL); \
} \
@@ -144,4 +144,4 @@
#undef POINTER_TYPE
#undef REFERENCE_TYPE
-#endif // SCOPED_PRIMITIVE_ARRAY_H_
+#endif // LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_PRIMITIVE_ARRAY_H_
diff --git a/header_only_include/nativehelper/scoped_string_chars.h b/header_only_include/nativehelper/scoped_string_chars.h
index 4debb2a..6c9f05c 100644
--- a/header_only_include/nativehelper/scoped_string_chars.h
+++ b/header_only_include/nativehelper/scoped_string_chars.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SCOPED_STRING_CHARS_H_
-#define SCOPED_STRING_CHARS_H_
+#ifndef LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_STRING_CHARS_H_
+#define LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_STRING_CHARS_H_
#include "jni.h"
#include "nativehelper_utils.h"
@@ -34,7 +34,7 @@
ScopedStringChars(JNIEnv* env, jstring s) : env_(env), string_(s), size_(0) {
if (s == NULL) {
chars_ = NULL;
- jniThrowNullPointerException(env, NULL);
+ jniThrowNullPointerException(env);
} else {
chars_ = env->GetStringChars(string_, NULL);
if (chars_ != NULL) {
@@ -70,4 +70,4 @@
DISALLOW_COPY_AND_ASSIGN(ScopedStringChars);
};
-#endif // SCOPED_STRING_CHARS_H_
+#endif // LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_STRING_CHARS_H_
diff --git a/header_only_include/nativehelper/scoped_utf_chars.h b/header_only_include/nativehelper/scoped_utf_chars.h
index bab7cb7..87df2c4 100644
--- a/header_only_include/nativehelper/scoped_utf_chars.h
+++ b/header_only_include/nativehelper/scoped_utf_chars.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SCOPED_UTF_CHARS_H_
-#define SCOPED_UTF_CHARS_H_
+#ifndef LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_UTF_CHARS_H_
+#define LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_UTF_CHARS_H_
#include <string.h>
@@ -36,7 +36,7 @@
ScopedUtfChars(JNIEnv* env, jstring s) : env_(env), string_(s) {
if (s == nullptr) {
utf_chars_ = nullptr;
- jniThrowNullPointerException(env, nullptr);
+ jniThrowNullPointerException(env);
} else {
utf_chars_ = env->GetStringUTFChars(s, nullptr);
}
@@ -91,4 +91,4 @@
DISALLOW_COPY_AND_ASSIGN(ScopedUtfChars);
};
-#endif // SCOPED_UTF_CHARS_H_
+#endif // LIBNATIVEHELPER_HEADER_ONLY_INCLUDE_NATIVEHELPER_SCOPED_UTF_CHARS_H_
diff --git a/include/nativehelper/JNIHelp.h b/include/nativehelper/JNIHelp.h
index 92a3882..858d625 100644
--- a/include/nativehelper/JNIHelp.h
+++ b/include/nativehelper/JNIHelp.h
@@ -20,172 +20,19 @@
* This file may be included by C or C++ code, which is trouble because jni.h
* uses different typedefs for JNIEnv in each language.
*/
-#ifndef NATIVEHELPER_JNIHELP_H_
-#define NATIVEHELPER_JNIHELP_H_
+#ifndef LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_JNIHELP_H_
+#define LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_JNIHELP_H_
#include <errno.h>
#include <unistd.h>
-#include <jni.h>
-#include "module_api.h"
+#include "libnativehelper_api.h"
#ifndef NELEM
-# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
+#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
#endif
/*
- * Register one or more native methods with a particular class.
- * "className" looks like "java/lang/String". Aborts on failure.
- * TODO: fix all callers and change the return type to void.
- */
-MODULE_API int jniRegisterNativeMethods(C_JNIEnv* env,
- const char* className,
- const JNINativeMethod* gMethods,
- int numMethods);
-
-/*
- * Throw an exception with the specified class and an optional message.
- *
- * The "className" argument will be passed directly to FindClass, which
- * takes strings with slashes (e.g. "java/lang/Object").
- *
- * If an exception is currently pending, we log a warning message and
- * clear it.
- *
- * Returns 0 on success, nonzero if something failed (e.g. the exception
- * class couldn't be found, so *an* exception will still be pending).
- *
- * Currently aborts the VM if it can't throw the exception.
- */
-MODULE_API int jniThrowException(C_JNIEnv* env, const char* className, const char* msg);
-
-/*
- * Throw an exception with the specified class and formatted error message.
- *
- * The "className" argument will be passed directly to FindClass, which
- * takes strings with slashes (e.g. "java/lang/Object").
- *
- * If an exception is currently pending, we log a warning message and
- * clear it.
- *
- * Returns 0 on success, nonzero if something failed (e.g. the exception
- * class couldn't be found, so *an* exception will still be pending).
- *
- * Currently aborts the VM if it can't throw the exception.
- */
-MODULE_API int jniThrowExceptionFmt(C_JNIEnv* env, const char* className, const char* fmt, va_list args);
-
-/*
- * Throw a java.lang.NullPointerException, with an optional message.
- */
-MODULE_API int jniThrowNullPointerException(C_JNIEnv* env, const char* msg);
-
-/*
- * Throw a java.lang.RuntimeException, with an optional message.
- */
-MODULE_API int jniThrowRuntimeException(C_JNIEnv* env, const char* msg);
-
-/*
- * Throw a java.io.IOException, generating the message from errno.
- */
-MODULE_API int jniThrowIOException(C_JNIEnv* env, int errnum);
-
-/*
- * Return a pointer to a locale-dependent error string explaining errno
- * value 'errnum'. The returned pointer may or may not be equal to 'buf'.
- * This function is thread-safe (unlike strerror) and portable (unlike
- * strerror_r).
- */
-MODULE_API const char* jniStrError(int errnum, char* buf, size_t buflen);
-
-/*
- * Returns a new java.io.FileDescriptor for the given int fd.
- */
-MODULE_API jobject jniCreateFileDescriptor(C_JNIEnv* env, int fd);
-
-/*
- * Returns the int fd from a java.io.FileDescriptor.
- */
-MODULE_API int jniGetFDFromFileDescriptor(C_JNIEnv* env, jobject fileDescriptor);
-
-/*
- * Sets the int fd in a java.io.FileDescriptor. Throws java.lang.NullPointerException
- * if fileDescriptor is null.
- */
-MODULE_API void jniSetFileDescriptorOfFD(C_JNIEnv* env,
- jobject fileDescriptor,
- int value);
-
-/*
- * Returns the long ownerId from a java.io.FileDescriptor.
- */
-MODULE_API jlong jniGetOwnerIdFromFileDescriptor(C_JNIEnv* env, jobject fileDescriptor);
-
-/*
- * Gets the managed heap array backing a java.nio.Buffer instance.
- *
- * Returns nullptr if there is no array backing.
- *
- * This method performs a JNI call to java.nio.NIOAccess.getBaseArray().
- */
-MODULE_API jarray jniGetNioBufferBaseArray(C_JNIEnv* env, jobject nioBuffer);
-
-/*
- * Gets the offset in bytes from the start of the managed heap array backing the buffer.
- *
- * Returns 0 if there is no array backing.
- *
- * This method performs a JNI call to java.nio.NIOAccess.getBaseArrayOffset().
- */
-MODULE_API jint jniGetNioBufferBaseArrayOffset(C_JNIEnv* env, jobject nioBuffer);
-
-/*
- * Gets field information from a java.nio.Buffer instance.
- *
- * Reads the |position|, |limit|, and |elementSizeShift| fields from the buffer instance.
- *
- * Returns the |address| field of the java.nio.Buffer instance which is only valid (non-zero) when
- * the buffer is backed by a direct buffer.
- */
-MODULE_API jlong jniGetNioBufferFields(C_JNIEnv* env,
- jobject nioBuffer,
- /*out*/jint* position,
- /*out*/jint* limit,
- /*out*/jint* elementSizeShift);
-
-/*
- * Gets the current position from a java.nio.Buffer as a pointer to memory in a fixed buffer.
- *
- * Returns 0 if |nioBuffer| is not backed by a direct buffer.
- *
- * This method reads the |address|, |position|, and |elementSizeShift| fields from the
- * java.nio.Buffer instance to calculate the pointer address for the current position.
- */
-MODULE_API jlong jniGetNioBufferPointer(C_JNIEnv* env, jobject nioBuffer);
-
-/*
- * Returns the reference from a java.lang.ref.Reference.
- */
-MODULE_API jobject jniGetReferent(C_JNIEnv* env, jobject ref);
-
-/*
- * Returns a Java String object created from UTF-16 data either from jchar or,
- * if called from C++11, char16_t (a bitwise identical distinct type).
- */
-MODULE_API jstring jniCreateString(C_JNIEnv* env, const jchar* unicodeChars, jsize len);
-
-/*
- * Log a message and an exception.
- * If exception is NULL, logs the current exception in the JNI environment.
- */
-MODULE_API void jniLogException(C_JNIEnv* env, int priority, const char* tag, jthrowable exception);
-
-/*
- * Clear the cache of constants libnativehelper is using.
- */
-MODULE_API void jniUninitializeConstants();
-
-/*
* For C++ code, we provide inlines that map to the C functions. g++ always
* inlines these, even on non-optimized builds.
*/
@@ -274,4 +121,4 @@
#endif // defined(__cplusplus)
-#endif /* NATIVEHELPER_JNIHELP_H_ */
+#endif // LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_JNIHELP_H_
diff --git a/include/nativehelper/JniInvocation.h b/include/nativehelper/JniInvocation.h
index 0d87aa9..9b7d510 100644
--- a/include/nativehelper/JniInvocation.h
+++ b/include/nativehelper/JniInvocation.h
@@ -14,18 +14,10 @@
* limitations under the License.
*/
-#ifndef JNI_INVOCATION_H_included
-#define JNI_INVOCATION_H_included
+#ifndef LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_JNIINVOCATION_H_
+#define LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_JNIINVOCATION_H_
-#include <jni.h>
-#include "module_api.h"
-
-struct JniInvocationImpl;
-
-MODULE_API struct JniInvocationImpl* JniInvocationCreate();
-MODULE_API void JniInvocationDestroy(struct JniInvocationImpl* instance);
-MODULE_API int JniInvocationInit(struct JniInvocationImpl* instance, const char* library);
-MODULE_API const char* JniInvocationGetLibrary(const char* library, char* buffer);
+#include "libnativehelper_api.h"
#ifdef __cplusplus
@@ -77,4 +69,4 @@
#endif // __cplusplus
-#endif // JNI_INVOCATION_H_included
+#endif // LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_JNIINVOCATION_H_
diff --git a/include/nativehelper/ScopedBytes.h b/include/nativehelper/ScopedBytes.h
index 7cb2ad0..371b1bb 100644
--- a/include/nativehelper/ScopedBytes.h
+++ b/include/nativehelper/ScopedBytes.h
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-#ifndef SCOPED_BYTES_H_included
-#define SCOPED_BYTES_H_included
+#ifndef LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDBYTES_H_
+#define LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDBYTES_H_
#include "JNIHelp.h"
#include <nativehelper/scoped_bytes.h>
-#endif // SCOPED_BYTES_H_included
+#endif // LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDBYTES_H_
diff --git a/include/nativehelper/ScopedLocalFrame.h b/include/nativehelper/ScopedLocalFrame.h
index 57873f2..4cb3d23 100644
--- a/include/nativehelper/ScopedLocalFrame.h
+++ b/include/nativehelper/ScopedLocalFrame.h
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-#ifndef SCOPED_LOCAL_FRAME_H_included
-#define SCOPED_LOCAL_FRAME_H_included
+#ifndef LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDLOCALFRAME_H_
+#define LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDLOCALFRAME_H_
#include <nativehelper/scoped_local_frame.h>
-#endif // SCOPED_LOCAL_FRAME_H_included
+#endif // LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDLOCALFRAME_H_
diff --git a/include/nativehelper/ScopedLocalRef.h b/include/nativehelper/ScopedLocalRef.h
index 0fb03d7..9960922 100644
--- a/include/nativehelper/ScopedLocalRef.h
+++ b/include/nativehelper/ScopedLocalRef.h
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-#ifndef SCOPED_LOCAL_REF_H_included
-#define SCOPED_LOCAL_REF_H_included
+#ifndef LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDLOCALREF_H_
+#define LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDLOCALREF_H_
#include "JNIHelp.h"
#include <nativehelper/scoped_local_ref.h>
-#endif // SCOPED_LOCAL_REF_H_included
+#endif // LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDLOCALREF_H_
diff --git a/include/nativehelper/ScopedPrimitiveArray.h b/include/nativehelper/ScopedPrimitiveArray.h
index 626b64f..830a712 100644
--- a/include/nativehelper/ScopedPrimitiveArray.h
+++ b/include/nativehelper/ScopedPrimitiveArray.h
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-#ifndef SCOPED_PRIMITIVE_ARRAY_H_included
-#define SCOPED_PRIMITIVE_ARRAY_H_included
+#ifndef LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDPRIMITIVEARRAY_H_
+#define LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDPRIMITIVEARRAY_H_
#include "JNIHelp.h"
#include <nativehelper/scoped_primitive_array.h>
-#endif // SCOPED_PRIMITIVE_ARRAY_H_included
+#endif // LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDPRIMITIVEARRAY_H_
diff --git a/include/nativehelper/ScopedStringChars.h b/include/nativehelper/ScopedStringChars.h
index 59c405c..f37d05c 100644
--- a/include/nativehelper/ScopedStringChars.h
+++ b/include/nativehelper/ScopedStringChars.h
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-#ifndef SCOPED_STRING_CHARS_H_included
-#define SCOPED_STRING_CHARS_H_included
+#ifndef LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDSTRINGCHARS_H_
+#define LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDSTRINGCHARS_H_
#include "JNIHelp.h"
#include <nativehelper/scoped_string_chars.h>
-#endif // SCOPED_STRING_CHARS_H_included
+#endif // LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDSTRINGCHARS_H_
diff --git a/include/nativehelper/ScopedUtfChars.h b/include/nativehelper/ScopedUtfChars.h
index f123115..b782a4e 100644
--- a/include/nativehelper/ScopedUtfChars.h
+++ b/include/nativehelper/ScopedUtfChars.h
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-#ifndef SCOPED_UTF_CHARS_H_included
-#define SCOPED_UTF_CHARS_H_included
+#ifndef LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDUTFCHARS_H_
+#define LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDUTFCHARS_H_
#include "JNIHelp.h"
#include <nativehelper/scoped_utf_chars.h>
-#endif // SCOPED_UTF_CHARS_H_included
+#endif // LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_SCOPEDUTFCHARS_H_
diff --git a/include/nativehelper/libnativehelper_api.h b/include/nativehelper/libnativehelper_api.h
new file mode 100644
index 0000000..b9e3570
--- /dev/null
+++ b/include/nativehelper/libnativehelper_api.h
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#ifndef LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_LIBNATIVEHELPER_API_H_
+#define LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_LIBNATIVEHELPER_API_H_
+
+#include <stddef.h>
+
+#include "jni.h"
+
+// This is the stable C API exported by libnativehelper.
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+/* ------------------------------------ C API for JNIHelp.h ------------------------------------- */
+
+/*
+ * Register one or more native methods with a particular class. "className" looks like
+ * "java/lang/String". Aborts on failure, returns 0 on success.
+ */
+int jniRegisterNativeMethods(C_JNIEnv* env,
+ const char* className,
+ const JNINativeMethod* gMethods,
+ int numMethods);
+
+/*
+ * Throw an exception with the specified class and an optional message.
+ *
+ * The "className" argument will be passed directly to FindClass, which
+ * takes strings with slashes (e.g. "java/lang/Object").
+ *
+ * If an exception is currently pending, we log a warning message and
+ * clear it.
+ *
+ * Returns 0 on success, nonzero if something failed (e.g. the exception
+ * class couldn't be found, so *an* exception will still be pending).
+ *
+ * Currently aborts the VM if it can't throw the exception.
+ */
+int jniThrowException(C_JNIEnv* env, const char* className, const char* msg);
+
+/*
+ * Throw an exception with the specified class and formatted error message.
+ *
+ * The "className" argument will be passed directly to FindClass, which
+ * takes strings with slashes (e.g. "java/lang/Object").
+ *
+ * If an exception is currently pending, we log a warning message and
+ * clear it.
+ *
+ * Returns 0 on success, nonzero if something failed (e.g. the exception
+ * class couldn't be found, so *an* exception will still be pending).
+ *
+ * Currently aborts the VM if it can't throw the exception.
+ */
+int jniThrowExceptionFmt(C_JNIEnv* env, const char* className, const char* fmt, va_list args);
+
+/*
+ * Throw a java.lang.NullPointerException, with an optional message.
+ */
+int jniThrowNullPointerException(C_JNIEnv* env, const char* msg);
+
+/*
+ * Throw a java.lang.RuntimeException, with an optional message.
+ */
+int jniThrowRuntimeException(C_JNIEnv* env, const char* msg);
+
+/*
+ * Throw a java.io.IOException, generating the message from errno.
+ */
+int jniThrowIOException(C_JNIEnv* env, int errnum);
+
+/*
+ * Return a pointer to a locale-dependent error string explaining errno
+ * value 'errnum'. The returned pointer may or may not be equal to 'buf'.
+ * This function is thread-safe (unlike strerror) and portable (unlike
+ * strerror_r).
+ */
+const char* jniStrError(int errnum, char* buf, size_t buflen);
+
+/*
+ * Returns a new java.io.FileDescriptor for the given int fd.
+ */
+jobject jniCreateFileDescriptor(C_JNIEnv* env, int fd);
+
+/*
+ * Returns the int fd from a java.io.FileDescriptor.
+ */
+int jniGetFDFromFileDescriptor(C_JNIEnv* env, jobject fileDescriptor);
+
+/*
+ * Sets the int fd in a java.io.FileDescriptor. Throws java.lang.NullPointerException
+ * if fileDescriptor is null.
+ */
+void jniSetFileDescriptorOfFD(C_JNIEnv* env, jobject fileDescriptor, int value);
+
+/*
+ * Returns the long ownerId from a java.io.FileDescriptor.
+ */
+jlong jniGetOwnerIdFromFileDescriptor(C_JNIEnv* env, jobject fileDescriptor);
+
+/*
+ * Gets the managed heap array backing a java.nio.Buffer instance.
+ *
+ * Returns nullptr if there is no array backing.
+ *
+ * This method performs a JNI call to java.nio.NIOAccess.getBaseArray().
+ */
+jarray jniGetNioBufferBaseArray(C_JNIEnv* env, jobject nioBuffer);
+
+/*
+ * Gets the offset in bytes from the start of the managed heap array backing the buffer.
+ *
+ * Returns 0 if there is no array backing.
+ *
+ * This method performs a JNI call to java.nio.NIOAccess.getBaseArrayOffset().
+ */
+jint jniGetNioBufferBaseArrayOffset(C_JNIEnv* env, jobject nioBuffer);
+
+/*
+ * Gets field information from a java.nio.Buffer instance.
+ *
+ * Reads the |position|, |limit|, and |elementSizeShift| fields from the buffer instance.
+ *
+ * Returns the |address| field of the java.nio.Buffer instance which is only valid (non-zero) when
+ * the buffer is backed by a direct buffer.
+ */
+jlong jniGetNioBufferFields(C_JNIEnv* env,
+ jobject nioBuffer,
+ /*out*/jint* position,
+ /*out*/jint* limit,
+ /*out*/jint* elementSizeShift);
+
+/*
+ * Gets the current position from a java.nio.Buffer as a pointer to memory in a fixed buffer.
+ *
+ * Returns 0 if |nioBuffer| is not backed by a direct buffer.
+ *
+ * This method reads the |address|, |position|, and |elementSizeShift| fields from the
+ * java.nio.Buffer instance to calculate the pointer address for the current position.
+ */
+jlong jniGetNioBufferPointer(C_JNIEnv* env, jobject nioBuffer);
+
+/*
+ * Returns the reference from a java.lang.ref.Reference.
+ */
+jobject jniGetReferent(C_JNIEnv* env, jobject ref);
+
+/*
+ * Returns a Java String object created from UTF-16 data either from jchar or,
+ * if called from C++11, char16_t (a bitwise identical distinct type).
+ */
+jstring jniCreateString(C_JNIEnv* env, const jchar* unicodeChars, jsize len);
+
+/*
+ * Log a message and an exception.
+ * If exception is NULL, logs the current exception in the JNI environment.
+ */
+void jniLogException(C_JNIEnv* env, int priority, const char* tag, jthrowable exception);
+
+/*
+ * Clear the cache of constants libnativehelper is using.
+ */
+void jniUninitializeConstants();
+
+/* ---------------------------------- C API for JniInvocation.h --------------------------------- */
+
+/*
+ * The JNI invocation API exists to allow a choice of library responsible for managing virtual
+ * machines.
+ */
+
+/*
+ * Opaque structure used to hold JNI invocation internal state.
+ */
+struct JniInvocationImpl;
+
+/*
+ * Creates an instance of a JniInvocationImpl.
+ */
+struct JniInvocationImpl* JniInvocationCreate();
+
+/*
+ * Associates a library with a JniInvocationImpl instance. The library should export C symbols for
+ * JNI_GetDefaultJavaVMInitArgs, JNI_CreateJavaVM and JNI_GetDefaultJavaVMInitArgs.
+ *
+ * The specified |library| should be the filename of a shared library. The |library| is opened with
+ * dlopen(3).
+ *
+ * If there is an error opening the specified |library|, then function will fallback to the
+ * default library "libart.so". If the fallback library is successfully used then a warning is
+ * written to the Android log buffer. Use of the fallback library is not considered an error.
+ *
+ * If the fallback library cannot be opened or the expected symbols are not found in the library
+ * opened, then an error message is written to the Android log buffer and the function returns 0.
+ *
+ * Returns 1 on success, 0 otherwise.
+ */
+int JniInvocationInit(struct JniInvocationImpl* instance, const char* library);
+
+/*
+ * Release resources associated with JniInvocationImpl instance.
+ */
+void JniInvocationDestroy(struct JniInvocationImpl* instance);
+
+/*
+ * Gets the default library for JNI invocation. The default library is "libart.so". This value may
+ * be overridden for debuggable builds using the persist.sys.dalvik.vm.lib.2 system property.
+ *
+ * The |library| argument is the preferred library to use on debuggable builds (when
+ * ro.debuggable=1). If the |library| argument is nullptr, then the system preferred value will be
+ * queried from persist.sys.dalvik.vm.lib.2 if the caller has provided |buffer| argument.
+ *
+ * The |buffer| argument is used for reading system properties in debuggable builds. It is
+ * optional, but should be provisioned to be PROP_VALUE_MAX bytes if provided to ensure it is
+ * large enough to hold a system property.
+ *
+ * Returns the filename of the invocation library determined from the inputs and system
+ * properties. The returned value may be |library|, |buffer|, or a pointer to a string constant
+ * "libart.so".
+ */
+const char* JniInvocationGetLibrary(const char* library, char* buffer);
+
+/* ---------------------------------- C API for toStringArray.h --------------------------------- */
+
+/*
+ * Allocates a new array for java/lang/String instances with space for |count| elements. Elements
+ * are initially null.
+ *
+ * Returns a new array on success or nullptr in case of failure. This method raises an
+ * OutOfMemoryError exception if allocation fails.
+ */
+jobjectArray newStringArray(JNIEnv* env, size_t count);
+
+/*
+ * Converts an array of C strings into a managed array of Java strings. The size of the C array is
+ * determined by the presence of a final element containing a nullptr.
+ *
+ * Returns a new array on success or nullptr in case of failure. This method raises an
+ * OutOfMemoryError exception if allocation fails.
+ */
+jobjectArray toStringArray(JNIEnv* env, const char* const* strings);
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+#endif // LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_LIBNATIVEHELPER_API_H_
diff --git a/include/nativehelper/module_api.h b/include/nativehelper/module_api.h
deleted file mode 100644
index 8b109e3..0000000
--- a/include/nativehelper/module_api.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2019 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
-
-#ifdef __cplusplus
-#define MODULE_API extern "C"
-#else
-#define MODULE_API
-#endif // __cplusplus
diff --git a/include/nativehelper/toStringArray.h b/include/nativehelper/toStringArray.h
index 1965d6a..02072b0 100644
--- a/include/nativehelper/toStringArray.h
+++ b/include/nativehelper/toStringArray.h
@@ -14,17 +14,10 @@
* limitations under the License.
*/
-#ifndef TO_STRING_ARRAY_H_included
-#define TO_STRING_ARRAY_H_included
+#ifndef LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_TOSTRINGARRAY_H_
+#define LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_TOSTRINGARRAY_H_
-#include <stddef.h>
-
-#include <jni.h>
-#include "module_api.h"
-
-// Public API for libnativehelper library.
-MODULE_API jobjectArray newStringArray(JNIEnv* env, size_t count);
-MODULE_API jobjectArray toStringArray(JNIEnv* env, const char* const* strings);
+#include "libnativehelper_api.h"
#ifdef __cplusplus
@@ -75,4 +68,4 @@
#endif // __cplusplus
-#endif // TO_STRING_ARRAY_H_included
+#endif // LIBNATIVEHELPER_INCLUDE_NATIVEHELPER_TOSTRINGARRAY_H_
diff --git a/include_jni/jni.h b/include_jni/jni.h
index 4c34313..f709d67 100644
--- a/include_jni/jni.h
+++ b/include_jni/jni.h
@@ -21,8 +21,8 @@
* Everything here is expected to be VM-neutral.
*/
-#ifndef JNI_H_
-#define JNI_H_
+#ifndef LIBNATIVEHELPER_INCLUDE_JNI_JNI_H_
+#define LIBNATIVEHELPER_INCLUDE_JNI_JNI_H_
#include <stdarg.h>
#include <stdint.h>
@@ -1140,4 +1140,4 @@
#define JNI_COMMIT 1 /* copy content, do not free buffer */
#define JNI_ABORT 2 /* free buffer w/o copying back */
-#endif /* JNI_H_ */
+#endif // LIBNATIVEHELPER_INCLUDE_JNI_JNI_H_
diff --git a/platform_include/nativehelper/detail/signature_checker.h b/platform_include/nativehelper/detail/signature_checker.h
index 7c2a7fc..d22c1e2 100644
--- a/platform_include/nativehelper/detail/signature_checker.h
+++ b/platform_include/nativehelper/detail/signature_checker.h
@@ -32,7 +32,8 @@
* Everything in this file except ostream<< is constexpr.
*/
-#pragma once
+#ifndef LIBNATIVEHELPER_PLATFORM_INCLUDE_NATIVEHELPER_DETAIL_SIGNATURE_CHECKER_H_
+#define LIBNATIVEHELPER_PLATFORM_INCLUDE_NATIVEHELPER_DETAIL_SIGNATURE_CHECKER_H_
#include <iostream> // std::ostream
#include <jni.h> // jni typedefs, JniNativeMethod.
@@ -1439,3 +1440,4 @@
} // namespace detail
} // namespace nativehelper
+#endif // LIBNATIVEHELPER_PLATFORM_INCLUDE_NATIVEHELPER_DETAIL_SIGNATURE_CHECKER_H_
diff --git a/platform_include/nativehelper/jni_macros.h b/platform_include/nativehelper/jni_macros.h
index da01e6f..b6f6a4b 100644
--- a/platform_include/nativehelper/jni_macros.h
+++ b/platform_include/nativehelper/jni_macros.h
@@ -141,8 +141,8 @@
* the stricter approach is taken: the most exact C++ type must be used.
*/
-#ifndef NATIVEHELPER_JNI_MACROS_H
-#define NATIVEHELPER_JNI_MACROS_H
+#ifndef LIBNATIVEHELPER_PLATFORM_INCLUDE_NATIVEHELPER_JNI_MACROS_H_
+#define LIBNATIVEHELPER_PLATFORM_INCLUDE_NATIVEHELPER_JNI_MACROS_H_
// The below basic macros do not perform automatic stringification,
// invoked e.g. as MAKE_JNI_NATIVE_METHOD("some_name", "()V", void_fn)
@@ -282,4 +282,4 @@
(to)
#endif
-#endif // NATIVEHELPER_JNI_MACROS_H
+#endif // LIBNATIVEHELPER_PLATFORM_INCLUDE_NATIVEHELPER_JNI_MACROS_H_
diff --git a/tests/jni_gtest/base/nativehelper/jni_gtest.h b/tests/jni_gtest/base/nativehelper/jni_gtest.h
index 975d56c..bed1ae0 100644
--- a/tests/jni_gtest/base/nativehelper/jni_gtest.h
+++ b/tests/jni_gtest/base/nativehelper/jni_gtest.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef LIBNATIVEHELPER_TESTS_JNI_GTEST_H
-#define LIBNATIVEHELPER_TESTS_JNI_GTEST_H
+#ifndef LIBNATIVEHELPER_TESTS_JNI_GTEST_BASE_NATIVEHELPER_JNI_GTEST_H_
+#define LIBNATIVEHELPER_TESTS_JNI_GTEST_BASE_NATIVEHELPER_JNI_GTEST_H_
#include <memory>
@@ -123,4 +123,4 @@
} // namespace android
-#endif // LIBNATIVEHELPER_TESTS_JNI_GTEST_H
+#endif // LIBNATIVEHELPER_TESTS_JNI_GTEST_BASE_NATIVEHELPER_JNI_GTEST_H_
diff --git a/toStringArray.cpp b/toStringArray.cpp
index b1f0f42..0c6a1a9 100644
--- a/toStringArray.cpp
+++ b/toStringArray.cpp
@@ -42,11 +42,11 @@
} // namespace
-MODULE_API jobjectArray newStringArray(JNIEnv* env, size_t count) {
+jobjectArray newStringArray(JNIEnv* env, size_t count) {
return env->NewObjectArray(count, JniConstants::GetStringClass(env), nullptr);
}
-MODULE_API jobjectArray toStringArray(JNIEnv* env, const char* const* strings) {
+jobjectArray toStringArray(JNIEnv* env, const char* const* strings) {
ArrayCounter counter(strings);
ArrayGetter getter(strings);
return toStringArray(env, &counter, &getter);