JNI 开发笔记 - 示例代码

来源:互联网 发布:淘宝网红店铺有哪些 编辑:程序博客网 时间:2024/05/29 05:54

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;}
0 0
原创粉丝点击