我尝试在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已包含在内。 哪个错误的步骤导致此错误? 请帮助我,谢谢。
答案 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;
}