Я пытаюсь добавить новый собственный кодировщик raw в hadoop-3.0.3, но столкнулся с ошибкой "UnsatisfiedLink".
Поскольку коды, которые я добавляю, копируются из существующего кодера XOR, логика может не ошибаться.
Я изменил существующий тестовый пример (TestNativeXORRawCoder), который также вызывает ту же ошибку.
тестовый код:
public class TestNativeMineRawCoder extends TestXORRawCoderBase {
@Before
public void setup() {
Assume.assumeTrue(ErasureCodeNative.isNativeCodeLoaded());
this.encoderFactoryClass = NativeMineRawErasureCoderFactory.class;
this.decoderFactoryClass = NativeMineRawErasureCoderFactory.class;
setAllowDump(true);
}
@Test
public void testAfterRelease63() throws Exception {
prepare(6, 3, null, null);
testAfterRelease();
}
}
нативная функция в Java:
private native void initImpl(int numDataUnits, int numParityUnits);
.c для jni:
JNIEXPORT void JNICALL
Java_org_apache_hadoop_io_erasurecode_rawcoder_NativeMineRawEncoder_initImpl
(JNIEnv *env, jobject thiz, jint numDataUnits, jint numParityUnits) {
XOREncoder* xorEncoder =
(XOREncoder*)malloc(sizeof(XOREncoder));
memset(xorEncoder, 0, sizeof(*xorEncoder));
initCoder(&xorEncoder->isalCoder, numDataUnits, numParityUnits);
setCoder(env, thiz, &xorEncoder->isalCoder);
}
Я ожидаю, что он пройдет тест, но возникают ошибки "UnsatisfiedLink"
TestNativeMineRawCoder.testAfterRelease63:41->TestRawCoderBase.testAfterRelease:116->TestRawCoderBase.prepareCoders:248->TestRawCoderBase.createEncoder:280 » UnsatisfiedLink
-
java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.erasurecode.rawcoder.NativeMineRawEncoder.initImpl(II)V
, поскольку файл .h генерируется автоматически, но файл .c создается и именуется мной самостоятельно, я думаю, это может вызвать ошибку, но я не знаю, как сообщить системе, что здесь целевой файл .c.