Jimmy Chen

A Programmer

(原创) JNI编程指南与规范 第二章 刻意练习

第二章之刻意练习

请在Java中定义两个native方法,其中一个native方法打印你的姓名,另一个native方法打印你的住址。请使用动态注册和静态注册两种方法来完成这两个native方法的编写

静态注册

Java侧代码如下:

class Information {
    private native void name();
    private native void addr();
    
    public static void main(String[] args) {
        Information in = new Information();
        in.name();
        in.addr();
    }
    
    static {
        System.loadLibrary("Information");
    }
}

然后通过指令javac Information.java编译出Information.class,通过指令javah -jni Information获取到Information.h文件,这个.h文件中就包含需要完成的native方法。

创建Information_static.c文件,代码如下:

#include <jni.h>
#include <stdio.h>
#include "Information.h"

JNIEXPORT void JNICALL Java_Information_name
  (JNIEnv * env, jobject obj)
{
    printf("My name is Jimmy Chen.\n");
}   

JNIEXPORT void JNICALL Java_Information_addr
  (JNIEnv * env, jobject obj)
{
    printf("My address is Guangdong Province.\n");
}

通过指令 cc -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -I. -fPIC -shared Information_static.c -o libInformation.so 编译出.so库,最后通过指令java -Djava.library.path=. Information 运行该程序就能得到想要的结果了。

动态注册

首先,Java侧的代码不需要变动。

native侧的话,创建一个Information_dynamic.c文件,代码如下:

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

void native_name(JNIEnv * env, jobject obj)
{
    printf("My name is Jimmy Chen.\n");
}

void native_addr(JNIEnv * env, jobject obj)
{
    printf("My addr is Guangdong Provice.\n");
}

const static JNINativeMethod gMethods[] = {
    "name", "()V", (void *)native_name,
    "addr", "()V", (void *)native_addr
};

static jclass myClass;
static const char * const ClassName = "Information";
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reversed)
{
    JNIEnv *env = NULL;
    jint result = -1;
    
    if((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_6) != JNI_OK)
        return -1;
        
    myClass = (*env)->FindClass(env, ClassName);
    if(myClass == NULL) {
        printf("Can not find class:%s.\n", ClassName);
        return -1;
    }
    
    if((*env)->RegisterNatives(env, myClass, gMethods, sizeof(gMethods)/sizeof(gMethods[0])) < 0) {
        printf("Register native mthods error.\n");
        return -1;
    }       
    
    printf("-----JNI_OnLoad Success-----\n");
    
    return JNI_VERSION_1_6; 
}

最后按照静态方法的编译和执行指令,编译运行即可,记住编译的时候将C文件名改为Information_dynamic.c文件就行了。

此文为博主原创文章,转载请注明出处

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d 博主赞过: