package com.cycfc.maccs.utils; public class GetFirstKey { public static native String getFirstKey(String str); static { // 加载动态链接库 System.loadLibrary("firstKey"); } }
javac -h -jni GetFirstKey.java
在生成的头文件中,有需要实现的本地方法名,复制到C++代码中,并指定参数名称
JNIEXPORT jstring JNICALL Java_com_cycfc_maccs_utils_GetFirstKey_getFirstKey (JNIEnv *, jclass, jstring);
在C++代码中引入生成的头文件,然后实现具体的本地方法
#include "com_cycfc_maccs_utils_GetFirstKey.h" JNIEXPORT jstring JNICALL Java_com_cycfc_maccs_utils_GetFirstKey_getFirstKey (JNIEnv *env, jclass, jstring str){ const char *pStr = env -> GetStringUTFChars(str,0); const char *secretKey; switch(*pStr){ case '1': secretKey = "123"; break; case '2': secretKey = "456"; break; default: secretKey = ""; } env -> ReleaseStringUTFChars(str,pStr); jstring key = env -> NewStringUTF((const char*)secretKey); return key; }
linux平台制作的是.so后缀,windos平台制作的是.dll后缀,macos平台后缀是.jnilib
jni.h路径为JAVA_HOME/include
jni_md.h路径为JAVA_HOME/include/linux
如果平台是32位系统,编译动态库时加上-m32参数即可
# linux平台 gcc firstKey.cpp -m32 -I /opt/jdk1.8.0_161/include/ -I /opt/jdk1.8.0_161/include/linux -lstdc++ -fPIC -shared -o libfirstKey.so #macos平台 gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/include/ -I /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/include/darwin firstKey.cpp -o libfirstKey.jnilib
System.getProperty("java.library.path")
获取