Chinaunix首页 | 论坛 | 博客
  • 博客访问: 395367
  • 博文数量: 119
  • 博客积分: 1796
  • 博客等级: 上尉
  • 技术积分: 890
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-14 10:16
个人简介

守正

文章分类
文章存档

2013年(1)

2011年(40)

2010年(78)

分类: 嵌入式

2010-09-07 20:55:55

    jni接口有两种映射方式,一种是传统的jni映射方式,即通过函数名称之间的对应关系来映射,jni函数名的格式为:Java _packagename _classname _methodname。还有一种是android特有的,Andorid使用了一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值,该映射表数组元素的类型为JNINativeMethod 。后面的例子就是使用第二种方式的:
该例子来自:
文件:hello-jni.cpp

#include <stdio.h>
#include <jni.h>
//#define LOG_TAG "HelloJni"

//#undef LOG

//#include


JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv * env, jobject obj)
{
        return env->NewStringUTF( (char *)"HelloJni Native String");
        //LOGD("Hello LIB!\n");


}

static JNINativeMethod methods[] = {
                {"stringFromJNI", "()Ljava/lang/String;", (void*)Java_com_example_hellojni_HelloJni_stringFromJNI },
};

static const char *classPathName = "com/example/hellojni/HelloJni";

/*
* Register several native methods for one class.
*/

static int registerNativeMethods(JNIEnv* env, const char* className,
                                JNINativeMethod* gMethods, int numMethods)
{
        jclass clazz;
        fprintf(stderr, "RegisterNatives start for '%s'", className);
        clazz = env->FindClass(className);
        if (clazz == NULL) {
                fprintf(stderr, "Native registration unable to find class '%s'", className);
                return JNI_FALSE;
        }
        if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
                fprintf(stderr, "RegisterNatives failed for '%s'", className);
                return JNI_FALSE;
        }

        return JNI_TRUE;
}

/*
* Register native methods for all classes we know about.
*
* returns JNI_TRUE on success.
*/

static int registerNatives(JNIEnv* env)
{
        if (!registerNativeMethods(env, classPathName,
                methods, sizeof(methods) / sizeof(methods[0]))) {
                        return JNI_FALSE;
        }

        return JNI_TRUE;
}


// ----------------------------------------------------------------------------


/*
* This is called by the VM when the shared library is first loaded.
*/


typedef union {
        JNIEnv* env;
        void* venv;
} UnionJNIEnvToVoid;

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
        UnionJNIEnvToVoid uenv;
        uenv.venv = NULL;
        jint result = -1;
        JNIEnv* env = NULL;

        printf("JNI_OnLoad");

        if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
                fprintf(stderr, "GetEnv failed");
                goto bail;
        }

        env = uenv.env;

        if (registerNatives(env) != JNI_TRUE) {
                fprintf(stderr, "GetEnv failed");
                goto bail;
}

                result = JNI_VERSION_1_4;
bail:
    return result;
}


阅读(1105) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~