GVKun编程网logo

如何解决“java.lang.UnsatisfiedLinkError:无法find依赖库”没有System32?(无法找到依赖的软件包)

15

如果您想了解如何解决“java.lang.UnsatisfiedLinkError:无法find依赖库”没有System32?和无法找到依赖的软件包的知识,那么本篇文章将是您的不二之选。我们将深入剖析

如果您想了解如何解决“java.lang.UnsatisfiedLinkError:无法find依赖库”没有System32?无法找到依赖的软件包的知识,那么本篇文章将是您的不二之选。我们将深入剖析如何解决“java.lang.UnsatisfiedLinkError:无法find依赖库”没有System32?的各个方面,并为您解答无法找到依赖的软件包的疑在这篇文章中,我们将为您介绍如何解决“java.lang.UnsatisfiedLinkError:无法find依赖库”没有System32?的相关知识,同时也会详细的解释无法找到依赖的软件包的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

如何解决“java.lang.UnsatisfiedLinkError:无法find依赖库”没有System32?(无法找到依赖的软件包)

如何解决“java.lang.UnsatisfiedLinkError:无法find依赖库”没有System32?(无法找到依赖的软件包)

我正在开发Eclipse上的Java项目,通过JNI使用C ++ OpenCV库。 一些image processingalgorithm是在本机端用OpenCV实现的,我希望从JNI中使用它们。

我build立了一个C ++ DLL项目来链接到Java,这导致了一个MyLibrary.dll文件。 我使用GCC 6.3编译器编译了OpenCV,并在Eclipse CDT上使用相同的GCC 6.3编译器编译C ++代码(以及MinGW Linker)。 我也检查是否有任何依赖问题使用Dependency Walker 。 到目前为止,我没有错误。

之后,我尝试从Java代码加载库,如下所示:

System.loadLibrary("MyLibrary")

我已经使用-Djava.library.path=pathtoMyLibrary设置path,并确保JVM知道本地库的地址。 我还在MyLibrary.dll旁边添加了所需的OpenCV库。

Directory.Exists保存目录句柄几秒钟

如何输出到当前可见的terminal

在Direct2D中绘制图像的一部分

如何从linux tun / tap读取数据包

通过旧的(非wchar)API函数在非ANSI系统上打开文件

但是,我得到以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries at java.lang.classLoader$NativeLibrary.load(Native Method) at java.lang.classLoader.loadLibrary0(UnkNown Source) at java.lang.classLoader.loadLibrary(UnkNown Source) at java.lang.Runtime.loadLibrary0(UnkNown Source) at java.lang.System.loadLibrary(UnkNown Source) ...

然后问题消失,当我将依赖的OpenCV库移动到System32文件夹。

我的问题是 我怎么能解决这个问题, 而不移动所需的DLL文件到System32文件夹?

Qt:文件名中的非ASCII字符被replace为'?'

创build一个停止button,以停止在C#窗口窗体应用程序的logging

在应用程序进程死亡/崩溃时终止subprocess

GCC c ++ 11使用大量的RAM,STL位集<UINT_MAX>

文件传输应用程序

此问题的最佳实践是调用库加载方法自行加载相关库:

System.loadLibrary("opencv_1"); System.loadLibrary("opencv_2"); ...

现在您加载相关的libararies后,可以用同样的方法安全地加载自己的dll文件:

System.loadLibrary("MyFile");

这应该解决can't file dependent libraries错误。

另一个解决方法(没有最佳实践)是将依赖的dll文件(在你的情况下opencv DLL)复制到System32文件夹。

为什么发生这种情况?

我想,当你设置java.library.path参数时,你有责任加载库的依赖库,而不是操作系统本身。 我不确定是否诚实。

正如在JNI项目中如何解决UnsatisfiedLinkError(无法找到依赖库)中所述 ,您可以通过向虚拟机添加-XshowSettings:properties -version参数来检查路径。

Android NDK项目:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

Android NDK项目:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

如何解决Android NDK项目:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader?

我是NDK的新手。

我想在我的标准Java Android Studio项目中添加一些C ++代码。

我做了什么:

  1. 在主文件夹下添加cpp文件夹

  2. 在my cpp文件夹中添加myccplib.cpp和myccplib.h

  3. 在Gradle(模块)中添加以下内容:

    android { 
    
     externalNativeBuild {
    
             cmake {
    
                 version "3.10.2"
             } 
     } 
     }
    
  4. myccplib.cpp中的
  5. 代码:

    #include "myccplib.h"
    
    
     #include <jni.h>
     #include <string>
    
     extern "C" JNIEXPORT jstring JNICALL
    
    
     Java_com_example_tof_MainActivity_stringFromJNI( jnienv *env,jobject /* this */) {
         std::string hello = "Hello,World!";
         return env->NewStringUTF(hello.c_str());
     }
    
  6. MainActivity.java中的代码:

 public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("myccplib"); // "myjni.dll" in Windows,"libmyjni.so" in Unixes
    }


    public native String stringFromJNI();


 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

  String s = stringFromJNI();
        Log.d("stringFromJNI " + s);



}

}

我的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library,sets it as either STATIC
# or SHARED,and provides the relative paths to its source code.
# You can define multiple libraries,and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default,you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries,such as libraries you define in this
# build script,prebuilt third-party libraries,or system libraries.

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

问题:我崩溃了:

2020-10-14 19:02:45.465 25918-25918/com.example.tof E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tof,PID: 25918
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.tof-t8Csh416BSdO6UBfZv0mOw==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.tof-t8Csh416BSdO6UBfZv0mOw==/lib/arm64,/system/lib64,/product/lib64]]] Couldn''t find "libmyccplib.so"
    at java.lang.Runtime.loadLibrary0(Runtime.java:1067)
    at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
    at java.lang.System.loadLibrary(System.java:1667)
    at com.example.tof.MainActivity.<clinit>(MainActivity.java:37)

我使用的是Android 4.0。

有人能告诉我我想念什么吗?

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

android – java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

android – java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

有没有经历过这个错误的人?

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.swig.simple-2/base.apk"],nativeLibraryDirectories=[/vendor/lib,/system/lib]]] Couldn''t find "liborg.swig.simple.example.so"

通过这种方式加载库时发生错误.

static {
    System.loadLibrary("example");
}

我确定’example’类存在于当前文件夹中.

解决方法

请注意,有一个命名约定.您的lib需要被称为libexample.so.

LoadLibrary(“example”)将查找libexample.so.

.so库需要在lib文件夹下的apk下面(因为你正在为Android开发,它需要在lib / armeabi和lib / armeabi-v7a文件夹下 – 为什么这两个文件夹?某些版本的Android看起来在lib下/ armeabi和一些看下lib / armeabi-v7a … se什么对你有用).

其他要寻找的东西:

>确保编译正确的体系结构(如果编译为armeabi v5,它将无法在armeabiv7或armeabiv7s上运行).
>确保导出的原型在正确的类中使用(请查看hello jni示例.您的公开函数需要看起来像Java_mypackagename_myjavabridgeclass_myfunction).

例如,函数Java_com_example_sample_hello将在java类com.example.sample,function hello中进行转换.

android – Java.lang.UnsatisfiedLinkError:找不到int 的实现

android – Java.lang.UnsatisfiedLinkError:找不到int 的实现

参见英文答案 > Android NDK C++ JNI (no implementation found for native…)                                    11个
我执行youtube看我的android应用程序项目.我只是在我的项目中添加一些类并使用ndk构建.我得到了错误

java.lang.UnsatisfiedLinkError: No implementation found for int com.ephronsystem.mobilizerapp.Ffmpeg.encodeVideoFrame(byte[]) (tried Java_com_ephronsystem_mobilizerapp_Ffmpeg_encodeVideoFrame and Java_com_ephronsystem_mobilizerapp_Ffmpeg_encodeVideoFrame___3B).

我的代码:

package com.ephronsystem.mobilizerapp;

public class Ffmpeg {

     static {
        System.loadLibrary("ffmpeg");
    }

    public static native boolean init(int width,int height,int audio_sample_rate,String rtmpurl);

    public static native void shutdown();

    // Returns the size of the encoded frame.
    public static native int encodeVideoFrame(byte[] yuv_image);

    public static native int encodeAudioFrame(short[] audio_data,int length);
}

这是ffmpeg-jni.c

#include <android/log.h>
#include <string.h>
#include <jni.h>
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/opt.h"

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jboolean JNICALL Java_com_ephronsystem_mobilizerapp_Ffmpeg_init(jnienv *env,jobject thiz,jint width,jint height,jint audio_sample_rate,jstring rtmp_url);
JNIEXPORT void JNICALL Java_com_ephronsystem_mobilizerapp_Ffmpeg_shutdown(jnienv *env,jobject thiz
);
JNIEXPORT jint JNICALL Java_com_ephronsystem_mobilizerapp_Ffmpeg_encodeVideoFrame(jnienv
*env,jbyteArray
yuv_image);
JNIEXPORT jint JNICALL Java_com_ephronsystem_mobilizerapp_Ffmpeg_encodeAudioFrame(jnienv *env,jshortArray audio_data,jint length);

#ifdef __cplusplus
}
#endif

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,"ffmpeg-jni",__VA_ARGS__)
#define URL_WRONLY 2
        static AVFormatContext *fmt_context;
        static AVStream *video_stream;
        static AVStream *audio_stream;

        static int pts
= 0;
static int last_audio_pts = 0;

// Buffers for UV format conversion
static unsigned char *u_buf;
static unsigned char *v_buf;

static int enable_audio = 1;
static int64_t audio_samples_written = 0;
static int audio_sample_rate = 0;

// Stupid buffer for audio samples. Not even a proper ring buffer
#define AUdio_MAX_BUF_SIZE 16384  // 2x what we get from Java
static short audio_buf[AUdio_MAX_BUF_SIZE];
static int audio_buf_size = 0;

void AudioBuffer_Push(const short *audio,int num_samples) {
    if (audio_buf_size >= AUdio_MAX_BUF_SIZE - num_samples) {
        LOGI("AUdio BUFFER OVERFLOW: %i + %i > %i",audio_buf_size,num_samples,AUdio_MAX_BUF_SIZE);
        return;
    }
    for (int i = 0; i < num_samples; i++) {
        audio_buf[audio_buf_size++] = audio[i];
    }
}

int AudioBuffer_Size() { return audio_buf_size; }

short *AudioBuffer_Get() { return audio_buf; }

void AudioBuffer_Pop(int num_samples) {
    if (num_samples > audio_buf_size) {
        LOGI("Audio buffer Pop WTF: %i vs %i",audio_buf_size);
        return;
    }
    memmove(audio_buf,audio_buf + num_samples,num_samples * sizeof(short));
    audio_buf_size -= num_samples;
}

void AudioBuffer_Clear() {
    memset(audio_buf,sizeof(audio_buf));
    audio_buf_size = 0;
}

static void log_callback(void *ptr,int level,const char *fmt,va_list vl) {
    char x[2048];
    vsnprintf(x,2048,fmt,vl);
    LOGI(x);
}

JNIEXPORT jboolean JNICALL Java_com_ephronsystem_mobilizerapp_Ffmpeg_init(jnienv *env,jint audio_sample_rate_param,jstring rtmp_url) {
    avcodec_register_all();
    av_register_all();
    av_log_set_callback(log_callback);

    fmt_context = avformat_alloc_context();
    AVOutputFormat *ofmt = av_guess_format("flv",NULL,NULL);
    if (ofmt) {
        LOGI("av_guess_format returned %s",ofmt->long_name);
    } else {
        LOGI("av_guess_format fail");
        return JNI_FALSE;
    }

    fmt_context->oformat = ofmt;
    LOGI("creating video stream");
    video_stream = av_new_stream(fmt_context,0);

    if (enable_audio) {
        LOGI("creating audio stream");
        audio_stream = av_new_stream(fmt_context,1);
    }

    // Open Video Codec.
    // ======================
    AVCodec *video_codec = avcodec_find_encoder(AV_CODEC_ID_H264);
    if (!video_codec) {
        LOGI("Did not find the video codec");
        return JNI_FALSE;  // leak!
    } else {
        LOGI("Video codec found!");
    }
    AVCodecContext *video_codec_ctx = video_stream->codec;
    video_codec_ctx->codec_id = video_codec->id;
    video_codec_ctx->codec_type = AVMEDIA_TYPE_VIDEO;
    video_codec_ctx->level = 31;

    video_codec_ctx->width = width;
    video_codec_ctx->height = height;
    video_codec_ctx->pix_fmt = PIX_FMT_YUV420P;
    video_codec_ctx->rc_max_rate = 0;
    video_codec_ctx->rc_buffer_size = 0;
    video_codec_ctx->gop_size = 12;
    video_codec_ctx->max_b_frames = 0;
    video_codec_ctx->slices = 8;
    video_codec_ctx->b_frame_strategy = 1;
    video_codec_ctx->coder_type = 0;
    video_codec_ctx->me_cmp = 1;
    video_codec_ctx->me_range = 16;
    video_codec_ctx->qmin = 10;
    video_codec_ctx->qmax = 51;
    video_codec_ctx->keyint_min = 25;
    video_codec_ctx->refs = 3;
    video_codec_ctx->trellis = 0;
    video_codec_ctx->scenechange_threshold = 40;
    video_codec_ctx->flags |= CODEC_FLAG_LOOP_FILTER;
    video_codec_ctx->me_method = ME_HEX;
    video_codec_ctx->me_subpel_quality = 6;
    video_codec_ctx->i_quant_factor = 0.71;
    video_codec_ctx->qcompress = 0.6;
    video_codec_ctx->max_qdiff = 4;
    video_codec_ctx->time_base.den = 10;
    video_codec_ctx->time_base.num = 1;
    video_codec_ctx->bit_rate = 3200 * 1000;
    video_codec_ctx->bit_rate_tolerance = 0;
    video_codec_ctx->flags2 |= 0x00000100;

    fmt_context->bit_rate = 4000 * 1000;

    av_opt_set(video_codec_ctx,"partitions","i8x8,i4x4,p8x8,b8x8",0);
    av_opt_set_int(video_codec_ctx,"direct-pred",1,"rc-lookahead","fast-pskip","mixed-refs","8x8dct","weightb",0);

    if (fmt_context->oformat->flags & AVFMT_GLOBALHEADER)
        video_codec_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;

    LOGI("opening video codec");
    AVDictionary *vopts = NULL;
    av_dict_set(&vopts,"profile","main",0);
    //av_dict_set(&vopts,"vprofile",0);
    av_dict_set(&vopts,"tune","film","preset","ultrafast",0);
    av_opt_set(video_codec_ctx->priv_data,0);
    int open_res = avcodec_open2(video_codec_ctx,video_codec,&vopts);
    if (open_res < 0) {
        LOGI("Error opening video codec: %i",open_res);
        return JNI_FALSE;   // leak!
    }

    // Open Audio Codec.
    // ======================

    if (enable_audio) {
        AudioBuffer_Clear();
        audio_sample_rate = audio_sample_rate_param;
        AVCodec *audio_codec = avcodec_find_encoder(AV_CODEC_ID_AAC);
        if (!audio_codec) {
            LOGI("Did not find the audio codec");
            return JNI_FALSE;  // leak!
        } else {
            LOGI("Audio codec found!");
        }
        AVCodecContext *audio_codec_ctx = audio_stream->codec;
        audio_codec_ctx->codec_id = audio_codec->id;
        audio_codec_ctx->codec_type = AVMEDIA_TYPE_AUdio;
        audio_codec_ctx->bit_rate = 128000;
        audio_codec_ctx->bit_rate_tolerance = 16000;
        audio_codec_ctx->channels = 1;
        audio_codec_ctx->profile = FF_PROFILE_AAC_LOW;
        audio_codec_ctx->sample_fmt = AV_SAMPLE_FMT_FLT;
        audio_codec_ctx->sample_rate = 44100;

        LOGI("opening audio codec");
        AVDictionary *opts = NULL;
        av_dict_set(&opts,"strict","experimental",0);
        open_res = avcodec_open2(audio_codec_ctx,audio_codec,&opts);
        LOGI("audio frame size: %i",audio_codec_ctx->frame_size);

        if (open_res < 0) {
            LOGI("Error opening audio codec: %i",open_res);
            return JNI_FALSE;   // leak!
        }
    }

    const jbyte *url = (*env)->GetStringUTFChars(env,rtmp_url,NULL);

    // Point to an output file
    if (!(ofmt->flags & AVFMT_NOFILE)) {
        if (avio_open(&fmt_context->pb,url,URL_WRONLY) < 0) {
            LOGI("ERROR: Could not open file %s",url);
            return JNI_FALSE;  // leak!
        }
    }
    (*env)->ReleaseStringUTFChars(env,url);

    LOGI("Writing output header.");
    // Write file header
    if (avformat_write_header(fmt_context,NULL) != 0) {
        LOGI("ERROR: av_write_header Failed");
        return JNI_FALSE;
    }

    pts = 0;
    last_audio_pts = 0;
    audio_samples_written = 0;

    // Initialize buffers for UV format conversion
    int frame_size = video_codec_ctx->width * video_codec_ctx->height;
    u_buf = (unsigned char *) av_malloc(frame_size / 4);
    v_buf = (unsigned char *) av_malloc(frame_size / 4);

    LOGI("ffmpeg encoding init done");
    return JNI_TRUE;
}

JNIEXPORT void JNICALL Java_com_ephronsystem_mobilizerapp_Ffmpeg_shutdown(jnienv
*env,jobject thiz
) {
av_write_trailer(fmt_context);
avio_close(fmt_context
->pb);
avcodec_close(video_stream
->codec);
if (enable_audio) {
avcodec_close(audio_stream
->codec);
}
av_free(fmt_context);
av_free(u_buf);
av_free(v_buf);

fmt_context = NULL;
u_buf = NULL;
v_buf = NULL;
}

JNIEXPORT jint JNICALL Java_com_ephronsystem_mobilizerapp_Ffmpeg_encodeVideoFrame(jnienv
*env,jbyteArray
yuv_image) {
int yuv_length = (*env)->GetArrayLength(env,yuv_image);
unsigned char *yuv_data = (*env)->GetByteArrayElements(env,yuv_image,0);

AVCodecContext *video_codec_ctx = video_stream->codec;
//LOGI("Yuv size: %i w: %i h: %i",yuv_length,video_codec_ctx->width,video_codec_ctx->height);

int frame_size = video_codec_ctx->width * video_codec_ctx->height;

const unsigned char *uv = yuv_data + frame_size;

// Convert YUV from NV12 to I420. Y channel is the same so we don''t touch it,// we just have to deinterleave UV.
for (
int i = 0;
i < frame_size / 4; i++) {
v_buf[i] = uv[i * 2];
u_buf[i] = uv[i * 2 + 1];
}

AVFrame source;
memset(&source,sizeof(AVFrame));
source.data[0] =
yuv_data;
source.data[1] =
u_buf;
source.data[2] =
v_buf;
source.linesize[0] = video_codec_ctx->
width;
source.linesize[1] = video_codec_ctx->width / 2;
source.linesize[2] = video_codec_ctx->width / 2;

// only for bitrate regulation. irrelevant for sync.
source.
pts = pts;
pts++;

int out_length = frame_size + (frame_size / 2);
unsigned char *out = (unsigned char *) av_malloc(out_length);
int compressed_length = avcodec_encode_video(video_codec_ctx,out,out_length,&source);

(*env)->
ReleaseByteArrayElements(env,yuv_data,0);

// Write to file too
if (compressed_length > 0) {
AVPacket pkt;
av_init_packet(&pkt);
pkt.
pts = last_audio_pts;
if (video_codec_ctx->coded_frame && video_codec_ctx->coded_frame->key_frame) {
pkt.flags |= 0x0001;
}
pkt.
stream_index = video_stream->index;
pkt.
data = out;
pkt.
size = compressed_length;
if (
av_interleaved_write_frame(fmt_context,&pkt) != 0) {
LOGI("Error writing video frame");
}
} else {
LOGI("??? compressed_length <= 0");
}

last_audio_pts++;

av_free(out);
return
compressed_length;
}

JNIEXPORT jint JNICALL Java_com_ephronsystem_mobilizerapp_Ffmpeg_encodeAudioFrame(jnienv
*env,jshortArray
audio_data,jint length
) {
if (!enable_audio) {
return 0;
}

short *audio = (*env)->GetShortArrayElements(env,audio_data,0);
//LOGI("java audio buffer size: %i",length);

AVCodecContext *audio_codec_ctx = audio_stream->codec;

unsigned char *out = av_malloc(128000);

AudioBuffer_Push(audio,length
);

int total_compressed = 0;
while (

AudioBuffer_Size()

>= audio_codec_ctx->frame_size) {
AVPacket pkt;
av_init_packet(&pkt);

int compressed_length = avcodec_encode_audio(audio_codec_ctx,128000,AudioBuffer_Get());

total_compressed +=
compressed_length;
audio_samples_written += audio_codec_ctx->
frame_size;

int new_pts = (audio_samples_written * 1000) / audio_sample_rate;
if (compressed_length > 0) {
pkt.
size = compressed_length;
pkt.
pts = new_pts;
last_audio_pts = new_pts;
//LOGI("audio_samples_written: %i  comp_length: %i   pts: %i",(int)audio_samples_written,(int)compressed_length,(int)new_pts);
pkt.flags |= 0x0001;
pkt.
stream_index = audio_stream->index;
pkt.
data = out;
if (
av_interleaved_write_frame(fmt_context,&pkt) != 0) {
LOGI("Error writing audio frame");
}
}
AudioBuffer_Pop(audio_codec_ctx
->frame_size);
}

(*env)->
ReleaseShortArrayElements(env,audio,0);

av_free(out);
return
total_compressed;
}

解决方法

当JVM在执行期间找不到您的本机库时,通常会发生此错误.您的本机代码必须编译为.so文件,并在运行时使其可用于JVM.

您可以在java.library.path和链接here上找到更多详细信息

android – java.lang.UnsatisfiedLinkError:找不到本机方法

android – java.lang.UnsatisfiedLinkError:找不到本机方法

我正在尝试创建NDK应用程序,但是我收到此错误:

java.lang.UnsatisfiedLinkError: Native method not found: com.example.hellondk.jni.HelloNDK.hello:()I

我不明白,因为C函数的名称与Java包名和类相同

HelloNDK.cpp

#include <jni.h>

JNIEXPORT jint JNICALL Java_com_example_hellondk_jni_HelloNDK_hello(jnienv* env,jobject o){
    return (jint) 2;
}

HelloNDK.java

package com.example.hellondk.jni;

public class HelloNDK {
    public native int hello();

    static {
        System.loadLibrary("HelloNDK");
    }
}

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloNDK
LOCAL_SRC_FILES := HelloNDK.cpp

include $(BUILD_SHARED_LIBRARY)

解决方法

您将其导出为C函数,但JNI链接器不了解C名称重整,因此无法找到它.

你可以使用extern“C”来导出没有C名称修改的函数:

extern "C" JNIEXPORT jint JNICALL Java_com_example_hellondk_jni_HelloNDK_hello(jnienv* env,jobject o)
{
    return (jint) 2;
}

今天关于如何解决“java.lang.UnsatisfiedLinkError:无法find依赖库”没有System32?无法找到依赖的软件包的介绍到此结束,谢谢您的阅读,有关Android NDK项目:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader、android – java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader、android – Java.lang.UnsatisfiedLinkError:找不到int 的实现、android – java.lang.UnsatisfiedLinkError:找不到本机方法等更多相关知识的信息可以在本站进行查询。

本文标签: