零聲大學(xué)生春招秋招Linux C/C++開發(fā)就業(yè)
JNIEnv
這個(gè)是JNIEnv是可以用來新建Java對(duì)象實(shí)例并調(diào)用對(duì)象方法的。值得注意的地方有兩個(gè):
這個(gè)JNIEnv必須每次調(diào)用時(shí)都要重新獲取。
在C環(huán)境下創(chuàng)建的子線程中,獲取JNIEnv必須要AttachCurrentThread
例子如下:
JNIEnv *NZJNI_GetEnv(){
? ?JNIEnv *env = nullptr;
? ?if (g_javavm) {
? ? ? ?if (g_javavm->GetEnv((void **)(&env), JNI_VERSION_1_6) != JNI_OK) {
? ? ? ? ? ?NZLOGE("NZJNI_GetEnv can't get the enviroument");
? ? ? ?}
? ?} else {
? ? ? ?NZLOGE("NZJNI_GetEnv null javavm");
? ?}
? ?return env;}JNIEnv *NZJNI_AttachCurrentThread(){
? ?JNIEnv *env = nullptr;
? ?if (g_javavm) {
? ? ? ?if (g_javavm->AttachCurrentThread(&env, nullptr) != JNI_OK) {
? ? ? ? ? ?NZLOGE("NZJNI_AttachCurrentThread can't get the enviroument");
? ? ? ?}
? ?} else {
? ? ? ?NZLOGE("NZJNI_AttachCurrentThread null javavm");
? ?}
? ?return env;}JNIEnv *NZJNI_AutoAttachAndGetEnv(bool *newAttached){
? ?JNIEnv *env = nullptr;
? ?if (g_javavm) {
? ? ? ?jint result = g_javavm->GetEnv((void **) (&env), JNI_VERSION_1_6);
? ? ? ?if (result == JNI_OK) {
? ? ? ? ? ?*newAttached = false;
? ? ? ? ? ?return env;
? ? ? ?} else if (result == JNI_EDETACHED) {
? ? ? ? ? ?if (g_javavm->AttachCurrentThread(&env, nullptr) == JNI_OK) {
? ? ? ? ? ? ? ?*newAttached = true;
? ? ? ? ? ? ? ?return env;
? ? ? ? ? ?} else {
? ? ? ? ? ? ? ?NZLOGE("NZJNI_AutoAttachAndGetEnv can't AttachCurrentThread ");
? ? ? ? ? ? ? ?*newAttached = false;
? ? ? ? ? ? ? ?return env;
? ? ? ? ? ?}
? ? ? ?} else {
? ? ? ? ? ?NZLOGE("NZJNI_AutoAttachAndGetEnv can't GetEnv");
? ? ? ? ? ?*newAttached = false;
? ? ? ? ? ?return env;
? ? ? ?}
? ?} else {
? ? ? ?NZLOGE("NZJNI_AutoAttachAndGetEnv null javavm");
? ? ? ?return env;
? ?}}void NZJNI_DetachCurrentThread(){
? ?if (g_javavm) {
? ? ? ?if (g_javavm->DetachCurrentThread() != JNI_OK) {
? ? ? ? ? ?NZLOGE("NZJNI_DetachCurrentThread failure");
? ? ? ?}
? ?} else {
? ? ? ?NZLOGE("NZJNI_DetachCurrentThread null javavm");
? ?}}