如果您想了解如何解决“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?(无法找到依赖的软件包)
- Android NDK项目:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader
- android – java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader
- android – Java.lang.UnsatisfiedLinkError:找不到int 的实现
- android – java.lang.UnsatisfiedLinkError:找不到本机方法
如何解决“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?
我是NDK的新手。
我想在我的标准Java Android Studio项目中添加一些C ++代码。
我做了什么:
-
在主文件夹下添加cpp文件夹
-
在my cpp文件夹中添加myccplib.cpp和myccplib.h
-
在Gradle(模块)中添加以下内容:
android { externalNativeBuild { cmake { version "3.10.2" } } }
myccplib.cpp中的 -
代码:
#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()); }
-
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
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’类存在于当前文件夹中.
解决方法
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 的实现
我执行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; }
解决方法
您可以在java.library.path和链接here上找到更多详细信息
android – java.lang.UnsatisfiedLinkError:找不到本机方法
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)
解决方法
你可以使用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:找不到本机方法等更多相关知识的信息可以在本站进行查询。
本文标签: