学习native可以更好的看Jdk源代码 😂 😂 😂 jni.mp4 (22.61MB)

    1. package top.huzhurong.test;
    2. public class HelloWorld {
    3. //申明一个native方法
    4. public native void sayHelloWorld();
    5. //装入动态链接库,"HelloWorld"是装入动态链接库的名称
    6. //在我的mac机器上,这里会去Extensions里边找 lib动态库名字.jnilib..==> libHelloWorld.jnilib
    7. static {
    8. System.loadLibrary("HelloWorld");
    9. }
    10. public static void main(String[] args) {
    11. HelloWorld helloWorld = new HelloWorld();
    12. helloWorld.sayHelloWorld();
    13. }
    14. }
    • javac 编译成class文件
    • javah 生成 .h 文件(c++) 其效果和Java中的接口类试
    • 实现javah生成的.h文件, 实现文件 xx.cpp
    • 生成动态链接库.

    javah 生成的 .h 文件
    javah -jni top.huzhurong.test.HelloWorld

    1. /* DO NOT EDIT THIS FILE - it is machine generated */
    2. #include <jni.h>
    3. /* Header for class top_huzhurong_test_HelloWorld */
    4. #ifndef _Included_top_huzhurong_test_HelloWorld
    5. #define _Included_top_huzhurong_test_HelloWorld
    6. #ifdef __cplusplus
    7. extern "C" {
    8. #endif
    9. /*
    10. * Class: top_huzhurong_test_HelloWorld
    11. * Method: sayHelloWorld
    12. * Signature: ()V
    13. */
    14. JNIEXPORT void JNICALL Java_top_huzhurong_test_HelloWorld_sayHelloWorld
    15. (JNIEnv *, jobject);
    16. #ifdef __cplusplus
    17. }
    18. #endif
    19. #endif

    cpp实现文件

    1. #include "jni.h"
    2. #include "top_huzhurong_test_HelloWorld.h"
    3. #include <stdio.h>
    4. JNIEXPORT void JNICALL Java_top_huzhurong_test_HelloWorld_sayHelloWorld(JNIEnv *env,jobject obj){
    5. printf("Hello World!\n");
    6. return;
    7. }

    gcc编译生成动态链接库

    1. gcc -shared -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin/ HelloWorld.cpp -o libHelloWorld.jnilib
    • darwin MacOSX

    cp 移动生成的 libHelloWorld.jnilibj/Library/Java/Extensions
    在我的机器上

    1. System.getProperty("java.library.path")
    2. 输出
    3. /Users/admin/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.

    运行输出
    image.png