2016-07-18 7 views
-1

JNIでプレビルド共有ライブラリを使用しようとしました。 しかし、私はJNIライブラリをビルドすると、関数の定義されていない参照に常に不平を言っています。Android NDK/JNI - プレビルドライブラリを使用して定義された関数への未定義参照

ここは私のAndroid.mkファイルです。

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := mtestlib 
LOCAL_SRC_FILES := mtest/arm64-v8a/lib/libtest.so 
LOCAL_EXPORT_C_INCLUDES := mtest/arm64-v8a/include 
LOCAL_EXPORT_LDLIBS := mtest/arm64-v8a/lib/libtest.so 
LOCAL_PRELINK_MODULE := true 
include $(PREBUILT_SHARED_LIBRARY) 


include $(CLEAR_VARS) 
LOCAL_MODULE := myJNI 
LOCAL_SRC_FILES := myJNI.cpp 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/mtest/arm64-v8a/include 
LOCAL_SHARED_LIBRARY := mtestlib 
include $(BUILD_SHARED_LIBRARY) 

これは私のJNIファイルです。

#include "lucien_example_com_jtest_myNDK.h" 
#include <android/log.h> 
#include <iostream> 
#include <iostream> 
#include "Mtest.h" 

JNIEXPORT jint JNICALL Java_lucien_example_com_jtest_myNDK_test 
    (JNIEnv *env, jobject, jstring tmp){ 
    const char* str; 
    str = env->GetStringUTFChars(tmp,false); 
    std::cout<< str << std::endl; 
    env->ReleaseStringUTFChars(tmp,str); 
    mtest(str); 
} 

Mtest.hヘッダー:

#include <stdio.h> 
#include <stdlib.h> 
#include <cutils/properties.h> 
#include <utils/Log.h> 
int mtest(const char *str); 

MTESTソースファイル:私は未定義の参照JNI負荷MTEST()関数を文句だ、なぜ私にはわからない

#include "Mtest.h" 
#define LOG_TAG "Test" 
int mtest(const char *str){ 
    ALOGE("[Lucien] test(%s)", str); 
    return 0; 
} 

。 ヘッダーと事前ビルドlibは既に含まれています。 このエラーの原因となる間違ったステップはどれですか? 助けてください、ありがとう。

答えて

0

あなたの関数の名前が.hファイルとソースファイルには同じではありません。

int mtest(const char *str); 

int mjpeg(const char *str){ 
    ALOGE("[Lucien] test(%s)", str); 
    return 0; 
} 

は、ソースファイルにMTESTを呼び出してみてください。

int mtest(const char *str){ 
    ALOGE("[Lucien] test(%s)", str); 
    return 0; 
} 

あなたのJNI呼び出しで一致させるには:

JNIEXPORT jint JNICALL Java_lucien_example_com_jtest_myNDK_test 
    (JNIEnv *env, jobject, jstring tmp){ 
    ... 
    mtest(str); 
} 

EDIT 1

あなたのjni関数は、jintを返すことを期待していますが、あなたは何も返していません。関数の最後にreturn文を入力してください:

JNIEXPORT jint JNICALL Java_lucien_example_com_jtest_myNDK_test 
    (JNIEnv *env, jobject, jstring tmp){ 
    const char* str; 
    str = env->GetStringUTFChars(tmp,false); 
    std::cout<< str << std::endl; 
    env->ReleaseStringUTFChars(tmp,str); 
    mtest(str); 

    //Example: 
    return 0; 

} 
+0

申し訳ありませんが、間違ったソースファイルを貼り付けます。 私のソースファイルでは、header、source、およびJNI呼び出しの機能が一致しています。 – Ting

関連する問題