我想使用 C++ 模板为 JNI 代码中的 java 数组开发(又一个)包装器。主要目标是提高我的 C++ 模板编程技能。
我使用 Android NDK 编译代码(编译器是 Clang 6.0.2)
到目前为止,我已经设法做到了:
#include <jni.h>
template <typename T>
struct TypeToObjectType;
template <>
struct TypeToObjectType<jbyteArray>
{
typedef jbyte type;
};
template <>
struct TypeToObjectType<jintArray>
{
typedef jint type;
};
template <typename javaArrayT, typename nativeT>
class Java_array{
JNIEnv *env;
jboolean is_copy;
jsize array_len;
javaArrayT array;
typename TypeToObjectType<javaArrayT>::type *array_elements;
public:
Java_array(JNIEnv *_env, javaArrayT _array)
: env(_env)
, array(_array)
, array_len(-1)
{
array_elements = env->GetByteArrayElements(array, &is_copy); //TODO: make it resolving automatically to other primitives
}
~Java_array() {
env->ReleaseByteArrayElements(array, array_elements, JNI_ABORT);
}
jsize len(){
if (array_len < 0)
array_len = env->GetArrayLength(array);
return array_len;
}
operator nativeT* () const {
return reinterpret_cast<nativeT*>(array_elements);
};
};
这不适用于int[]
和float[]
其他数组byte[]
,因为此类调用GetByteArrayElements
.
我struct TypeToObjectType
用来建立映射jbyteArray
-> jbyte
, jintArray
-> jint
。
此映射缺少部分 java 类型 ->JEnv
方法调用,即jbyteArray
-> ( GetByteArrayElements
, ReleaseByteArrayElements
), jintArray
-> ( GetIntArrayElements
, ReleaseIntArrayElements
)`
我该怎么做?
如何使用 C++11、C++14 的功能改进我的代码?