Android NDK / JNI - 对使用prebuild库定义的函数的未定义引用

时间:2016-07-18 16:11:41

标签: android android-ndk java-native-interface

我尝试在JNI中使用预建共享库。 但是当我构建JNI库时,它总是抱怨函数未定义的引用。

这是我的Android.mk文件。

if (Office.context.requirements.isSetSupported("ExcelApi", 1.2 )
{
   range.format.columnWidth = 25;
}

这是我的JNI文件。

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)

Mtest.h标题:

#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源文件:

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

我不知道为什么我在JNI加载mtest()函数时抱怨未定义的引用。 标题和预建lib已包含在内。 哪个错误的步骤导致此错误? 请帮助我,谢谢。

1 个答案:

答案 0 :(得分: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);
}

编辑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;

}