Java native 关键字简单案例(Mac)
java native关键字:允许开发者通过调用c/c++的程序满足自己的开发需求。
在java中声明一个native方法,但不通过java实现,而是用c/c++实现这个方法。
在java中通过调用c/c++生成的动态链接库,从而达到自己的开发需求。
java本身也有许多native方法(比如StrictMath.java中),也是通过c/c++实现StrictMath.java中的方法,在jvm中调用并返回结果实现的。
流程说明在NativeTest.java中
文件目录结构:
- lib
- libhello.jnilib
- src
- jni.h
- jni_md.h
- libhello.jnilib
- NativeTest.java
-
/** * 步骤: * 1. 编写一个java文件,比如:NativeTest.java,其中包含native方法 * 2. 使用 javac NativeTest.java 命令生成class文件 * 3. 使用 javah -classpath . -jni Java.NativeTest(全限定名称) 命令生成 Java_NativeTest.h 文件 * 4. 查看 Java_NativeTest.h 文件中的方法 * 5. 编写 NativeTestImpl.c 文件,并实现其中的方法 * 6. 将 /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/include/jni.h * /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/include/darwin/jni_md.h * 复制到src目录下 * sudo cp jni.h ~/WorkSpace/study/src * sudo cp ./darwin/jni_md.h ~/WorkSpace/study/src * 7. 使用如下命令生成动态链接库 * gcc -dynamiclib NativeTestImpl.c -o libhello.jnilib * 在mac下,.jnilib 是固定的,名字必须要以 lib 开头,在调用的时候,必须吧 lib 省略,只需要写 hello * 8. 运行java程序,调用 native 方法 * 使用命令 java NativeTest * * 可能遇到的问题: * 问题一: * ./Java_NativeTest.h:2:10: error: 'jni.h' file not found with
include; use "quotes" instead * #include */ public class NativeTest { static{ //加载动态库的名称 System.loadLibrary("hello"); } public native void hello(); public static void main(String[] args) { new NativeTest().hello(); } }* 解决方法: * 将 Java_NativeTest.h 中 #include 改为 #include "jni.h" * * 问题二: * java.lang.UnsatisfiedLinkError: no hello in java.library.path * 解决方法: * 在项目根目录下创建lib文件夹,与src同级,在idea中,选择project structure, * 选择Libraries,选择添加java,选择lib文件夹,作为Native LoLibraries cation,点击确定
* 或者可以指定其他位置,只需要将lib添加到工程依赖中 - NativeTest.h
-
/* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" /* Header for class NativeTest */ #ifndef _Included_NativeTest #define _Included_NativeTest #ifdef __cplusplus extern "C" { #endif /* * Class: NativeTest * Method: hello * Signature: ()V */ JNIEXPORT void JNICALL Java_NativeTest_hello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
NativeTest.h - NativeTestImpl.c
-
#include "jni.h" #include "NativeTest.h" #include
NativeTestImpl.cJNIEXPORT void JNICALL Java_NativeTest_hello(JNIEnv *env, jobject obj){ printf("NaviteTest hello world!\n"); return ; }