So.私はこのlibをfastpbkdf2というC言語で見つけ出し、共有libを作りました。Android NDKの共有ライブラリの使い方(C libにC++を追加)
libからメソッドの1つを呼び出す小さなC++スニペットを作成しました。しかし、私は常に得ています
error: undefined reference to ...
私は非常に多くのものを検索し、すべてを試してみましょう。おそらくここではっきりと分からないことがあるでしょう。 (ああ、私はC++やCのためにプログラムしたことがないので、多分問題かもしれません)
すべてのファイルは同じフォルダにあります。
ここAndroid.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := pbkdf2core
LOCAL_SRC_FILES := libpbkdf2core.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := pbkdf2
LOCAL_SRC_FILES := pbkdf2.cpp
LOCAL_SHARED_LIBRARIES := pbkdf2core
include $(BUILD_SHARED_LIBRARY)
はここでC++での私の試みだだ:
#include <jni.h>
#include "native.h"
#include <pbkdf2core.h>
extern "C"{
JNIEXPORT jbyteArray JNICALL Java_com_package_generatePBKDF2key
(JNIEnv * env, jclass cls, jbyteArray password, jbyteArray salt, jint iterations)
{
uint8_t * out;
fastpbkdf2HmacSha1(jbyteArrayToString(env, password),
env->GetArrayLength(password),
jbyteArrayToString(env, salt),
env->GetArrayLength(salt),
(int) iterations, out, 32);
jbyteArray bytes = env->NewByteArray(32);
env->SetByteArrayRegion(bytes, 0, 32, (jbyte*)out);
return bytes;
//return password; --> running only this works ok
}
uint8_t* jbyteArrayToString(JNIEnv* env, jbyteArray barr)
{
uint8_t* rtn = NULL;
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0)
{
rtn = (uint8_t*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}
//commenting out "bad" code, and running only this really works
JNIEXPORT jint JNICALL Java_com_package_getNum(JNIEnv * env, jclass cls){
return 1;
}
}
そしてpbkdf2core.h:
#include <jni.h>
#include <stdlib.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
void fastpbkdf2HmacSha1(const uint8_t *pw, size_t npw,
const uint8_t *salt, size_t nsalt,
uint32_t iterations,
uint8_t *out, size_t nout);
#ifdef __cplusplus
}
#endif
私は "悪い" コードをスキップすると、すべてのもの(私は他の方法を実行するか、最初から何かを返すことができるので、他のすべての設定はokです)。
ヘッダから何かを変更すると、別のエラー(宣言されていない)が発生します。私はここで何が欠けていますか? (オハイオ州私が使用しているのlibはC.
に編集されています。
ここに私が取得エラーです:。
[armeabi] Compile++ thumb: pbkdf2 <= pbkdf2.cpp
[armeabi] SharedLibrary : libpbkdf2.so
/Users/.../src/main/jni/pbkdf2.cpp:15: error: undefined reference to 'fastpbkdf2HmacSha1'
collect2: error: ld returned 1 exit status
make: *** [/Users/.../src/main/obj/local/armeabi/libpbkdf2.so] Error 1
ああ、私はまた
LOCAL_ALLOW_UNDEFINED := true
てみました
ビルドはOKです(明らかに)が、アプリケーションランタイムエラーが発生します。
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "fastpbkdf2HmacSha1"
あなたは正確なエラーメッセージを投稿できますか? –
エラーが発生しました。 – dmestrovic