JNI,由以下原因引起:java.lang.unsatifiedLinkError:com.tencent.wxapp.core.JNI.JNI.call(Ljava/util/List;)[B

JNI,由以下原因引起:java.lang.unsatifiedLinkError:com.tencent.wxapp.core.JNI.JNI.call(Ljava/util/List;)[B,java,c++,java-native-interface,Java,C++,Java Native Interface,我尝试在Java中调用cpp,在打包到Jar中之后,在运行之后会发生这样的错误。 我可以在Linux系统中运行这些代码,但我后悔在将它们打包到jar中后报告了错误 我应该如何修改我的程序?有命名问题吗 com.tencent.oceanus.jar.program.ProgramInvocationException: org.apache.flink.client.program.ProgramInvocationException: The program caused an err

我尝试在Java中调用cpp,在打包到Jar中之后,在运行之后会发生这样的错误。 我可以在Linux系统中运行这些代码,但我后悔在将它们打包到jar中后报告了错误

我应该如何修改我的程序?有命名问题吗

    com.tencent.oceanus.jar.program.ProgramInvocationException: org.apache.flink.client.program.ProgramInvocationException: The program caused an error: 
    at com.tencent.oceanus.jar.CliFrontend.executeProgram(CliFrontend.java:248)
    at com.tencent.oceanus.jar.CliFrontend.getJobGraph(CliFrontend.java:168)
    at com.tencent.oceanus.server.jobs.JobManager.compile(JobManager.java:257)
    at com.tencent.oceanus.server.jobs.transitions.StartTransitionCallback$StartThread.start(StartTransitionCallback.java:236)
    at com.tencent.oceanus.server.jobs.transitions.StartTransitionCallback$StartThread.run(StartTransitionCallback.java:142)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.flink.client.program.ProgramInvocationException: The program caused an error: 
    at org.apache.flink.client.program.OptimizerPlanEnvironment.getOptimizedPlan(OptimizerPlanEnvironment.java:93)
    at com.tencent.oceanus.jar.program.ClusterClient.getOptimizedPlan(ClusterClient.java:244)
    at com.tencent.oceanus.jar.program.ClusterClient.run(ClusterClient.java:316)
    at com.tencent.oceanus.jar.program.ClusterClient.run(ClusterClient.java:285)
    at com.tencent.oceanus.jar.CliFrontend.executeProgram(CliFrontend.java:242)
    ... 9 more
Caused by: java.lang.UnsatisfiedLinkError: com.tencent.wxapp.core.jni.JNI.call(Ljava/util/List;)[B
    at com.tencent.wxapp.core.jni.JNI.call(Native Method)
    at com.tencent.wxapp.core.jni.JNITest.main(JNITest.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.tencent.oceanus.jar.program.CustomPackagedProgram.callMainMethod(CustomPackagedProgram.java:314)
    at com.tencent.oceanus.jar.program.CustomPackagedProgram.invokeInteractiveModeForExecution(CustomPackagedProgram.java:213)
    at org.apache.flink.client.program.OptimizerPlanEnvironment.getOptimizedPlan(OptimizerPlanEnvironment.java:83)
    ... 13 more
这是我的JNI.java

package com.tencent.wxapp.core.jni;

import java.io.*;
import java.util.List;

public class JNI{
    public native byte[] call(List<String> jList);
    static{
        InputStream is = JNI.class.getResourceAsStream("/JNIdll.so");
        File file = null;
        try {
            file = File.createTempFile("lib", ".so");
        } catch (IOException e) {
            e.printStackTrace();
        }
        OutputStream os = null;
        try {
            os = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        byte[] buffer = new byte[1024];
        int length = 0;
        while (true) {
            try {
                if (!((length = is.read(buffer)) != -1)) break;
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                os.write(buffer, 0, length);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.load(file.getAbsolutePath());
        file.deleteOnExit();


    }
}
package com.tencent.wxapp.core.jni;
导入java.io.*;
导入java.util.List;
公共类JNI{
公共本机字节[]调用(列表jList);
静止的{
InputStream=JNI.class.getResourceAsStream(“/jnidl.so”);
File=null;
试一试{
file=file.createTempFile(“lib”、“.so”);
}捕获(IOE异常){
e、 printStackTrace();
}
OutputStream os=null;
试一试{
os=新文件输出流(文件);
}catch(filenotfounde异常){
e、 printStackTrace();
}
字节[]缓冲区=新字节[1024];
整数长度=0;
while(true){
试一试{
如果(!((长度=is.read(buffer))!=-1))中断;
}捕获(IOE异常){
e、 printStackTrace();
}
试一试{
写操作(缓冲区,0,长度);
}捕获(IOE异常){
e、 printStackTrace();
}
}
试一试{
is.close();
}捕获(IOE异常){
e、 printStackTrace();
}
试一试{
os.close();
}捕获(IOE异常){
e、 printStackTrace();
}
load(file.getAbsolutePath());
deleteOnExit()文件;
}
}
这是我的JNI.cpp

//JNIdll.cpp文件

#include<stdio.h>
#include<iostream>
#include <strstream>
#include "hyperloglog.hpp"
#include <vector>
#include <string>
#include <fstream>
#include "JNI.h"


using namespace hll;
using namespace std;

JNIEXPORT jbyteArray JNICALL Java_JNI_call
  (JNIEnv *env, jobject obj,jobject jList){
      //实现代码
        HyperLogLog hll(10);
        // retrieve the java.util.List interface class
        jclass cList = env->FindClass("java/util/List");
        // retrieve the toArray method and invoke it
        jmethodID mToArray = env->GetMethodID(cList, "toArray", "()[Ljava/lang/Object;");
        jobjectArray array = (jobjectArray)env->CallObjectMethod(jList, mToArray);
        // now create the string array
        string* sArray = new string[env->GetArrayLength(array)];

        for(int i=0;i<env->GetArrayLength(array);i++) {
            // retrieve the chars of the entry strings and assign them to the array!
            jstring strObj = (jstring)env->GetObjectArrayElement(array, i);
            const char * chr = env->GetStringUTFChars(strObj, NULL);
            sArray[i].append(chr);
            env->ReleaseStringUTFChars(strObj, chr);
        }

        // just print the array to std::cout
        for(int i=0;i<env->GetArrayLength(array);i++) {
           //print value
           cout << sArray[i] << endl;
           const char* p = sArray[i].data();
           hll.add(p,10);
        }

        //print estimate value
        cout<<hll.estimate()<<endl;

        //输出到二进制流
        std::ostringstream sstream;
        hll.dump(sstream);

        const std::string nativeString = sstream.str(); //转换成字符串
        jbyteArray arr = env->NewByteArray(nativeString.length());
        env->SetByteArrayRegion(arr,0,nativeString.length(),(jbyte*)nativeString.c_str()); //存入到二进制array传回Java

    return arr;
}
//jnidl.cpp文件
#包括
#包括
#包括
#包括“hyperloglog.hpp”
#包括
#包括
#包括
#包括“JNI.h”
使用名称空间hll;
使用名称空间std;
JNIEXPORT jbyteArray JNICALL Java_JNI_调用
(JNINEV*env,作业对象,作业对象列表){
//实现代码
hyperloghll(10);
//检索java.util.List接口类
jclass cList=env->FindClass(“java/util/List”);
//检索toArray方法并调用它
jmethodID mToArray=env->GetMethodID(cList,“toArray”,“()[Ljava/lang/Object;”;
jobjectArray=(jobjectArray)env->CallObjectMethod(jList,mToArray);
//现在创建字符串数组
string*sArray=新字符串[env->GetArrayLength(数组)];
for(int i=0;IGetarray长度(数组);i++){
//检索条目字符串的字符并将其分配给数组!
jstring strObj=(jstring)env->GetObjectArrayElement(数组,i);
const char*chr=env->GetStringUTFChars(strObj,NULL);
sArray[i].附加(chr);
环境->释放StringUTFChars(strObj,chr);
}
//只需将数组打印到std::cout即可
for(int i=0;IGetarray长度(数组);i++){
//打印值

cout由于本机方法被声明为
com.tencent.wxapp.core.jni.jni.call
,Java正在共享库中寻找一个名为
Java\u com\u tencent\u wxapp\u core\u jni\u jni\u call
的方法。您已经导出了
Java\u jni\u call
,您的本机代码与Java代码中的包不匹配。而且,该静态初始值设定项它可以在多个地方抛出
NullPointerException
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNI */

#ifndef _Included_JNI
#define _Included_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JNI
 * Method:    call
 * Signature: (Ljava/util/ArrayList;)[B
 */
JNIEXPORT jbyteArray JNICALL Java_JNI_call
  (JNIEnv *, jobject, jobject);

#ifdef __cplusplus
}
#endif
#endif