首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >com.tencent.wxapp.core.jni.JNI.call(Ljava/util/List;)[B,由: java.lang.UnsatisfiedLinkError: JNI引起

com.tencent.wxapp.core.jni.JNI.call(Ljava/util/List;)[B,由: java.lang.UnsatisfiedLinkError: JNI引起
EN

Stack Overflow用户
提问于 2020-08-04 21:50:04
回答 1查看 93关注 0票数 0

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

我应该如何修改我的程序?是否存在命名问题?

代码语言:javascript
复制
    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

代码语言:javascript
复制
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();


    }
}

这是我的JNI.cpp

代码语言:javascript
复制
//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;
}

这是我的JNI.h

代码语言:javascript
复制
/* 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
EN

回答 1

Stack Overflow用户

发布于 2020-08-05 03:45:53

由于本机方法被声明为com.tencent.wxapp.core.jni.JNI.call,因此Java将在共享库中查找一个名为Java_com_tencent_wxapp_core_jni_JNI_call的方法。您已导出Java_JNI_call

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63248342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档