JNI 开发笔记 - 示例代码

本文深入解析了使用JNI(Java Native Interface)将C/C++代码与Java应用进行交互的过程,并通过示例代码展示了如何实现方法的JNI注册、调用Java方法以及处理异常情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SampleCode

#include <jni.h>
#include <stdio.h>
#include <errno.h>

//com/ex/Foo.java

/* Native function */
JNIEXPRORT jboolean JNICALL Java_com_ex_Foo_fooFunc(JNIEnv *env, jobject obj, jint k)
{
    if (k > 0)
        return JNI_TRUE;
    else
        return JNI_FALSE;
}

/* native code call java method */
JNIEXPRORT jboolean JNICALL Java_com_ex_Foo_callJavaFunc(JNIEnv *env, jobject obj, jint k)
{
    jboolean r = JNI_FALSE;
    jclass clazz = (*env)->GetObjectClass(env, obj);
    if (clazz == NULL)
        return r;
    jmethodID mID = (*env)->GetMethodID(env, clazz, "sayHello", "(I)Z");
    if (mID == NULL)
        return r;

    r = (*env)->CallBooleanMethod(env, obj, mID, 1);
    if (ExceptionCheck(env) == JNI_TRUE)
        return JNI_FALSE;
    else
        return r;
}

/**/
void fooPrintString(JNIEnv *env, jobject obj, jstring str)
{
    jchar *jstr = (*env)->GetStringUTFChars(env, str, 0);
    if (jstr == NULL)
        return NULL;

    printf("String from java:%s", jstr);
    (*env)->ReleaseStringUTFChars(env, str, jstr);
}

jint fooGetByteArray(JNIEnv *env, jclass clazz, jbyteArray array)
{
    jint len = (*env)->GetArrayLength(env, array);
    if (len < strlen("Hello Jni") + 1)
        return -1;

    jbyte *buf = (*env)->GetByteArrayElements(env, array, 0);
    if (buf == NULL)
        return -ENOMEM;

    jint r = sprintf(buf, "Hello Jni");
    (*env)->ReleaseByteArrayElements(env, array, buf, 0);
    return r;
}

static JNINativeMethod methods[] = {
    {"fooPrintString", "(Ljava/lang/String;)", (void *)fooPrintString},
    {"fooGetByteArray", "([B)I", (void *)fooGetByteArray},
};

jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
    JNIEnv *env;
    if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4) != JNI_OK)
        return JNI_ERR;

    jclass clazz = (*env)->FindClass(env, "com/ex/Foo");
    if (clazz == NULL)
        return JNI_ERR;

    jint len = sizeof(methods) / sizeof(methods[0]);
    (*env)->RegisterNatives(env, clazz, methods, len);

    return JNI_VERSION_1_4;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值