第二章之刻意练习
请在Java中定义两个native方法,其中一个native方法打印你的姓名,另一个native方法打印你的住址。请使用动态注册和静态注册两种方法来完成这两个native方法的编写
静态注册
Java侧代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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文件,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#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文件,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#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文件就行了。
此文为博主原创文章,转载请注明出处