Mac OS上编译JNI的动态库

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Mac OS上编译JNI的动态库脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

JNIJava Native Interface的缩写,是为了在Java上能够调用本地语言尤其是Cc++设计的。 下面就看下如何在Mac OS上面如何使用JNI的调用c语言##编写Java类 先定义一个Java

public class MacJni {      public native void sayHello();      static {         System.loadLibrary("macjni");     }      public static void main(String[] args) {         MacJni macJni = new MacJni();         macJni.sayHello();      } }

这里定义了一个MacJni的类,在它的main函数中调用了定义的native的方法sayHello。 在static中加载native的类库macjni,注意JNI的动态库在linux上面的命名是.so文件,而在Mac OS上面的命名是.jnilib,类库的名字需要加上lib,也就是在Mac OS上面动态库的名称应该libmacjni.jnilib

生成.class 通过命令生成.class文件: >javac MacJni.java

这样就可以生成了一个MacJni.class的文件。 ##生成.h文件 通过命令可以直接生成.class对应.h文件: >javah MacJni

生成了一个MacJni.h的文件。文件内容如下:

* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class MacJni */ #ifndef _Included_MacJni #define _Included_MacJni #ifdef __cplusplus extern "C" { #endif /*  * Class:     MacJni  * Method:    sayHello  * Signature: ()V  */ JNIExpORT void JNICALL Java_MacJni_sayHello   (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif

该文件定义了一个方法Java_MacJni_sayHello,这个方法对应定义的native方法public native void sayHello();。 JNI在C语言中定义的规则是:Java_包名_类名_方法名

编写.c文件 根据定义.h方法,需要编写一个一个.c文件MacJni.c,用来实现.h中的方法

#include <stdio.h> #include "MacJni.h"  JNIEXPORT void Java_MacJni_sayHello(JNIEnv * env, jobject obj){     printf("hello from jni"); }

这个方法很简单就是打印一句话:hello from jni。 ##编译.c 在MacJni.h中有一句话 > #include <jni.h>

jni.h是jdk中C语言库的头文件,在编译.c的时候需要指定jni.h的所在。在Mac OX中他所在的位置是:

/System/Library/Frameworks/JavaVM.framework/Headers

使用gcc编译: > gcc -i/System/Library/Frameworks/JavaVM.framework/Headers -c MacJni.c

就可以得到一个编译好的文件MacJni.o,下面需要把.o文件打包成动态库。 ##打包动态库 使用gcc可以直接打包动态库 >gcc -dynamiclib -o libmacjni.jnilib MacJni.o

把.o文件打包成了libmacjni.jnilib,就可以通过Java调用C语言了。

java MacJni

hello from jni

码地址:https://github.com/jjz/jni

脚本宝典总结

以上是脚本宝典为你收集整理的Mac OS上编译JNI的动态库全部内容,希望文章能够帮你解决Mac OS上编译JNI的动态库所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。