Java教程

java语言调用C++编写的本地方法

本文主要是介绍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")获取
  • 此时可以编写代码调用本地方法
这篇关于java语言调用C++编写的本地方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!