Java JNI绑定:JVM可以';找不到依赖库

Java JNI绑定:JVM可以';找不到依赖库,java,c,makefile,java-native-interface,Java,C,Makefile,Java Native Interface,我正在尝试为一个名为shoco的C项目创建JNI绑定。 当尝试用加载库时 System.loadLibrary("shocolibjni") JVM退出时出现错误“JVM找不到依赖库”。 我创建了一个def文件,其中包含要导出的函数: EXPORTS shoco_compress shoco_decompress Java_org_shoco_Shoco_compress Java_org_shoco_Shoco_decompress 我正在使用MINGW64下更新的项目makefile进行

我正在尝试为一个名为shoco的C项目创建JNI绑定。 当尝试用加载库时

System.loadLibrary("shocolibjni")
JVM退出时出现错误“JVM找不到依赖库”。 我创建了一个def文件,其中包含要导出的函数:

EXPORTS
shoco_compress
shoco_decompress
Java_org_shoco_Shoco_compress
Java_org_shoco_Shoco_decompress
我正在使用MINGW64下更新的项目makefile进行编译。 我试图将库放入系统目录,并将java.library.path设置为“.”,但我得到了相同的错误。我认为在这个项目中没有依赖库这样的东西。 可能是什么问题

JAVA代码:

package org.shoco;

public class Shoco {

    static {
        System.out.println(System.getProperty("java.library.path"));
        System.loadLibrary("shocolibjni");
    }

    public static native String compress(String s);

    public static native String decompress(String s, int compressedLength);

    public static String decompress(String s) {
        return decompress(s, s.length());
    }

    public static void main(String[] args) {
        String s = "This is a string which is used for test";
        String c = compress(s);
        System.out.println(c);
        String d = decompress(c);
        System.out.println(d);
    }
}
头文件org_shoco_shoco.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#define __int64 int64_t
#include <jni.h>
/* Header for class org_shoco_Shoco */
#ifndef _Included_org_shoco_Shoco
#define _Included_org_shoco_Shoco
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_shoco_Shoco
 * Method:    compress
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_org_shoco_Shoco_compress
  (JNIEnv *, jclass, jstring);

/*
 * Class:     org_shoco_Shoco
 * Method:    decompress
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_org_shoco_Shoco_decompress
  (JNIEnv *, jclass, jstring, jint);

#ifdef __cplusplus
}
#endif
#endif
/*不要编辑此文件-它是机器生成的*/
#定义
#包括
/*类组织的标题\u shoco\u shoco*/
#ifndef(包括)组织(包括)shoco(集团)shoco(集团)
#定义(包括)(组织)(商号)(商号)(商号)
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*类别:组织商号商号
*方法:压缩
*签名:(Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_org_shoco_shoco_compress
(JNIEnv*,jclass,jstring);
/*
*类别:组织商号商号
*方法:减压
*签名:(Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_org_shoco_shoco_解压
(JNIEnv*,jclass,jstring,jint);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
C文件org_shoco_shoco.C:

#define __int64 int64_t
#include <jni.h>
#include <stdio.h>
#include "org_shoco_Shoco.h"


/*
 * Class:     org_shoco_Shoco
 * Method:    compress
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_org_shoco_Shoco_compress
  (JNIEnv *env, jclass jcl, jstring jstr)
{
    char buffer[4096];
    const char *str = (*env)->GetStringUTFChars(env, jstr, 0);
    shoco_compress(str, 0, buffer, 4096);
    (*env)->ReleaseStringUTFChars(env, jstr, str);
    return (*env)->NewStringUTF(env, buffer);
}

/*
 * Class:     org_shoco_Shoco
 * Method:    decompress
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_org_shoco_Shoco_decompress
  (JNIEnv *env, jclass jcl, jstring jstr, jint comp_len)
{
    char buffer[4096];
    const char *str = (*env)->GetStringUTFChars(env, jstr, 0);
    shoco_decompress(str, comp_len, buffer, 4096);
    (*env)->ReleaseStringUTFChars(env, jstr, str);
    return (*env)->NewStringUTF(env, buffer);

}
定义
#包括
#包括
#包括“org_shoco_shoco.h”
/*
*类别:组织商号商号
*方法:压缩
*签名:(Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_org_shoco_shoco_compress
(JNIEnv*env,jclass-jcl,jstring-jstr)
{
字符缓冲区[4096];
const char*str=(*env)->GetStringUTFChars(env,jstr,0);
shoco_压缩(str,0,buffer,4096);
(*env)->发布StringUTFChars(env、jstr、str);
return(*env)->NewStringUTF(env,buffer);
}
/*
*类别:组织商号商号
*方法:减压
*签名:(Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_org_shoco_shoco_解压
(JNINEV*env,jcl类,jstring jstr,jint公司)
{
字符缓冲区[4096];
const char*str=(*env)->GetStringUTFChars(env,jstr,0);
shoco_减压器(str,comp_len,buffer,4096);
(*env)->发布StringUTFChars(env、jstr、str);
return(*env)->NewStringUTF(env,buffer);
}
生成文件:

FLAGS=$(CFLAGS) -std=c99 -O3 -Wall -I"/c/jdk1.7.0_80/include" -I"/c/jdk1.7.0_80/include/win32"
SOURCES=shoco.c org_shoco_Shoco.c
OBJECTS=$(SOURCES:.c=.o)
HEADERS=shoco.h shoco_model.h org_shoco_Shoco.h
GENERATOR=generate_compressor_model.py
TRAINING_DATA_DIR=training_data
TRAINING_DATA=$(wildcard training_data/*.txt)
TABLES_DIR=models
TABLES=$(TABLES_DIR)/text_en.h $(TABLES_DIR)/words_en.h $(TABLES_DIR)/filepaths.h

.PHONY: all
all: shoco shocolibjni.dll

shoco: shoco-bin.o $(OBJECTS) $(HEADERS)
    $(CC) $(LDFLAGS) $(OBJECTS) -s $< -o $@

test_input: test_input.o $(OBJECTS) $(HEADERS)
    $(CC) $(LDFLAGS) $(OBJECTS) -s $< -o $@

$(OBJECTS): %.o: %.c $(HEADERS)
    $(CC) $(FLAGS) $< -c

shoco_model.h: $(TABLES_DIR)/words_en.h
    cp $< $@

.PHONY: models
models: $(TABLES)

$(TABLES_DIR)/text_en.h: $(TRAINING_DATA) $(GENERATOR)
    python $(GENERATOR) $(TRAINING_DATA) -o $@

$(TABLES_DIR)/words_en.h: $(TRAINING_DATA) $(GENERATOR)
    python $(GENERATOR) --split=whitespace --strip=punctuation $(TRAINING_DATA) -o $@

$(TABLES_DIR)/dictionary.h: /usr/share/dict/words $(GENERATOR)
    python $(GENERATOR) $< -o $@

# Warning: This is *slow*! Use pypy when possible
$(TABLES_DIR)/filepaths.h: $(GENERATOR)
    find / -print 2>/dev/null | pypy $(GENERATOR) --optimize-encoding -o $@

.PHONY: check
check: tests

tests: tests.o $(OBJECTS) $(HEADERS)
    $(CC) $(LDFLAGS) $(OBJECTS) $< -o $@
    ./tests

.PHONY: clean
clean:
    rm *.o

.PHONY: js
js: shoco.js

shoco.js: $(OBJECTS) $(HEADERS) pre.js
    emcc shoco.c -O3 -o $@ --closure 1 -s EXPORTED_FUNCTIONS="['_shoco_compress', '_shoco_decompress']" --pre-js pre.js

shocolibjni.dll: $(OBJECTS)
    $(CC) -shared $^ -o $@ org_shoco_Shoco.def
FLAGS=$(CFLAGS)-std=c99-O3-Wall-I”/c/jdk1.7.0_80/include“-I”/c/jdk1.7.0_80/include/win32”
来源=shoco.c org_shoco_shoco.c
对象=$(源:.c=.o)
HEADERS=shoco.h shoco_model.h org_shoco_shoco.h
生成器=生成\u压缩机\u model.py
培训数据目录=培训数据
TRAINING_DATA=$(通配符TRAINING_DATA/*.txt)
表\u DIR=模型
TABLES=$(TABLES\u DIR)/text\u en.h$(TABLES\u DIR)/words\u en.h$(TABLES\u DIR)/filepath.h
冒牌货:全部
全部:shoco shocolibjni.dll
shoco:shoco bin.o$(对象)$(标题)
$(CC)$(LDFLAGS)$(对象)-s$<-o$@
测试输入:测试输入.o$(对象)$(标题)
$(CC)$(LDFLAGS)$(对象)-s$<-o$@
$(对象):%.o:%.c$(标题)
$(CC)$(标志)$<-c
shoco_model.h:$(表目录)/单词_en.h
cp$<$@
.冒牌货:模特
型号:$(表格)
$(表格目录)/text\u en.h:$(培训数据)$(生成器)
python$(生成器)$(训练数据)-o$@
$(表格目录)/单词\u en.h:$(培训数据)$(生成器)
python$(生成器)--拆分=空白--strip=标点$(训练数据)-o$@
$(TABLES_DIR)/dictionary.h:/usr/share/dict/words$(生成器)
python$(生成器)$<-o$@
#警告:这太慢了!尽可能使用pypy
$(TABLES\u DIR)/filepath.h:$(生成器)
find/-print 2>/dev/null | pypy$(生成器)——优化编码-o$@
.冒牌货:支票
检查:测试
测试:tests.o$(对象)$(标题)
$(CC)$(LDFLAGS)$(对象)$<-o$@
/测试
.假冒:干净
清洁:
rm*.o
.冒牌货:js
js:shoco.js
shoco.js:$(对象)$(标题)pre.js
emcc shoco.c-O3-o$@--closure 1-s导出的_函数=“[''u shoco_compress',''u shoco_decompress']”--pre js pre.js
shocolibjni.dll:$(对象)
$(CC)-共享$^-o$@org\u shoco\u shoco.def

路径
LD\u LIBRARY\u路径
上的dll/so,还是Java系统属性
Java.LIBRARY.PATH
中的文件夹中的dll/so?请显示更多代码,并描述此库相对于Java应用程序的位置?问题应该是自包含的。发布更多代码。请与Dependency Walker一起检查依赖库是什么,以及它们是否在路径上
java.library.path
是不够的,因为Windows不知道这一点。如果无法修改路径,也可以在加载JNI库之前使用完全限定名显式加载依赖库。dll/so是否位于
路径
LD_库路径
,或者位于Java系统属性
Java.library.PATH
中的文件夹中?请显示更多代码,并描述此库相对于Java应用程序的位置?问题应该是自包含的。发布更多代码。请与Dependency Walker一起检查依赖库是什么,以及它们是否在路径上
java.library.path
是不够的,因为Windows不知道这一点。如果无法修改路径,也可以在加载JNI库之前使用完全限定名显式加载依赖库。