我正在尝试为名为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
C file 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);
}
Makefile:
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