Android JNI Demo

 注意c++和c语法不一样

c语法(*env)->GetByteArrayElements(env, intArry, 0);

#include <jni.h>
#include <string>
#include "test.h"
#include <android/log.h>

JavaVM *global_jvm = NULL;
jclass uulogger_clazz = NULL;
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
    JNIEnv *env = NULL;
    jint result = -1;

    // 判断是否正确
    if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
        return result;
    }
    global_jvm = vm;
    uulogger_clazz = env->FindClass("com/example/wjrso/UULogger");
    if(uulogger_clazz != NULL)
    {
        //设置全局引用,防止多线程崩溃
        jobject obj = uulogger_clazz;
        obj = (jobject)env->NewGlobalRef(obj);
        uulogger_clazz = (jclass)obj;
    }
    return JNI_VERSION_1_6;
}

void logFunction(const char* data)
{
    //每次线程环境变量不一样,重新查找
    if(global_jvm == NULL)
    {
        return;
    }

    JNIEnv* env = NULL;
    global_jvm->AttachCurrentThread(&env, NULL);
    if (env == NULL)
    {
        return;
    }
    //jclass loggerClass = (*env)->FindClass(env,"com/example/wjrso/UULogger");
    if (uulogger_clazz == NULL)
    {
        return;
    }
    jmethodID  logMethodID = env->GetStaticMethodID(uulogger_clazz,"log","(Ljava/lang/String;)V");
    if (logMethodID == NULL)
    {
        return;
    }
    jstring string = env->NewStringUTF(data);
    env->CallStaticVoidMethod(uulogger_clazz,logMethodID,string);
    //(*global_jvm)->DetachCurrentThread(global_jvm);
    env->DeleteLocalRef(string);
}

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_wjrso_WjrSo_stringFromJNI(
        JNIEnv* env,
        jobject /* this */,
        jstring config) {
    const char* input;
    jboolean isCopy = false;
    input = env->GetStringUTFChars(config, &isCopy);
    std::string hello = getString();
    if (input != NULL)
    {
        hello += input;
        //释放资源
        env->ReleaseStringUTFChars(config, input);
    }

    logFunction("输出日志");
    return env->NewStringUTF(hello.c_str());
}

extern "C" JNIEXPORT void JNICALL
Java_com_example_wjrso_WjrSo_intArray(
        JNIEnv* env,
        jobject /* this */,
        jintArray intArry) {

    jboolean isCopy = false;
    jint* intAry = env->GetIntArrayElements(intArry,&isCopy);
    int count = env->GetArrayLength(intArry);
    for (int i = 0; i < count; ++i) {
        char buf[100] = {0};
        int n = intAry[i];
        sprintf(buf,"我是数字:%d",n);
        logFunction(buf);
    }

    env->ReleaseIntArrayElements(intArry,intAry,0);

    /* 部分C写法
     *  (*env)->GetByteArrayElements(env, intArry, 0);
     *  (*env)->ReleaseIntArrayElements(env,intArry,intAry,0);
     *  cls = (*env)->GetObjectClass(env, value);
     *  method = (*env)->GetMethodID(env, cls, "booleanValue", "()Z");
     *  if (method != NULL) {
     *       audit = (*env)->CallBooleanMethod(env, value, method);
     *  }
     */   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值