Mac下jni调用

?

MacOS 

编写HelloWorld.java

public class HelloWorld {

    public native void hello();

    static {
        //设置查找路径为当前项目路径
        System.setProperty("java.library.path", ".");
        //加载动态库的名称
        System.loadLibrary("hello");
    }

    public static void main(String[] args) {
        new HelloWorld().hello();
    }
}
Mac下jni调用

javac HelloWorld.java

编译生成.class

javah  HelloWorld

自动生成HelloWorld.h文件,内容为:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    hello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_hello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
Mac下jni调用

 

编写c文件:HelloWorldImpl.c

#include "jni.h"
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
    printf("Hello World!\n");
    return;
}
Mac下jni调用

在mac下动态链接库是.jnilib 

在此将c文件生成为文件:libhello.jnilib

生成动态链接库命令:

gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include HelloWorldImpl.c -o libhello.jnilib

Mac下jni调用

会报错:

Mac下jni调用?

Mac下jni调用

复制该文件到include目录下:

sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include
Mac下jni调用

 

重新执行生成动态链接库

 

运行java

java HelloWorld

输出:Hello World!

 

最后:

只剩下class和jnilib文件即可调用成功,两个文件任何文件改名都报异常

Mac下jni调用?

Mac下jni调用

修改动态链接库文件名:

Mac下jni调用?

Mac下jni调用

?

Mac下jni调用

上一篇:时间函数 time.h 详解


下一篇:解决移动端点击穿透问题_h5实现移动端点击事件穿透的多种解决方案