#if defined(__cplusplus)
typedef _JNIEnv JNIEnv;
typedef _JavaVM JavaVM;
#else
typedef const struct JNINativeInterface* JNIEnv;
typedef const struct JNIInvokeInterface* JavaVM;
#endif
jdk源码UNIXProcess_md.c,中有个函数直接拿过来编译报错,对照上面jni.h的定义很容易就可以发现问题。
static const char *
getBytes(JNIEnv *env, jbyteArray arr)
{
return arr == NULL ? NULL :
//(const char*) (*env)->GetByteArrayElements(env,arr, NULL);
//C和C++调用的区别,jdk源码是.c结尾的,我们用.cpp c++封装对应的jnienv的定义不同,改成下面的形式编译OK。
(const char*) env->GetByteArrayElements(arr, NULL);
}
报错信息
[exec] ../pipe.cpp: In function ‘const char* getBytes(JNIEnv*, _jbyteArray*)’:
[exec] ../pipe.cpp:661: error: base operand of ‘->’ has non-pointer type ‘JNIEnv_’