java语言调用C++编写的本地方法
作者:互联网
java语言调用C++编写的本地方法
java调用C++语言编写本地方法的步骤
- 编写本地方法的java类文件,并加载本地方法的动态链接库
package com.cycfc.maccs.utils;
public class GetFirstKey {
public static native String getFirstKey(String str);
static {
// 加载动态链接库
System.loadLibrary("firstKey");
}
}
- 生成java类的头文件
javac -h -jni GetFirstKey.java
- 利用C++语言编写本地方法
在生成的头文件中,有需要实现的本地方法名,复制到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")
获取 - 此时可以编写代码调用本地方法
标签:jstring,调用,java,C++,secretKey,本地,include 来源: https://blog.csdn.net/weixin_39146323/article/details/120418375