2023-01-19 363
使用JNI,我正在尝试为Android NDK编写本机C ++方法,该方法调用自定义标头文件中定义的C函数.但是,我的C函数调用遇到了不确定的参考错误.
这是我的C ++代码,它可以调用C函数,并将其结果返回Java作为JSTRING:
#include <jni.h>
#include "gesture_detector.h"
JNIEXPORT jstring JNICALL Java_com_example_bmtitest_JavaAbstractionLayer_callGestureAnalysis(JNIEnv *env, jobject obj, jfloat previousX, jfloat previousY, jfloat currentX, jfloat currentY) {
return env->NewStringUTF(gestureAnalysis(previousX, previousY, currentX, currentY));
}
这是我的C函数:
#include <stdio.h>
#include "gesture_detector.h"
//implemented from gesture_detector.h
const char* gestureAnalysis(float previousX, float previousY, float currentX, float currentY)
{
float xOffset = currentX - previousX;
float yOffset = currentY - previousY;
if(xOffset == 0 && yOffset == 0)
{
return "TAP";
}
return "0";
}
这是我的android.mk代码:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gestureDetector
LOCAL_SRC_FILES := gestureDetector.c NativeAbstractionLayer.cpp
LOCAL_LDLIBS := -landroid
include $(BUILD_SHARED_LIBRARY)
显然,似乎找不到自定义标题文件(gesture_detector.h)中定义的函数定义.我认为这可能是我的android.mk文件中的问题.
谁能告诉我我在这里做错了什么?
“未定义的参考”错误来自 Linker .您的标题文件仅满足编译器.
但是,由于您要混合C ++,因此您的问题可能是 name mangling .基本上,您需要告诉C ++编译器您要调用的函数是由C编译器而不是C ++ One创建的,因此没有将参数类型代码移植到其名称上.现在,它不知道,因此试图通过C ++样式的名称调用该函数,该名称与链接器实际上可用的函数的普通C名称不同.
在您的gesture_detector.h文件的开头添加此内容:
#ifdef __cplusplus
extern "C" {
#endif
,最后
#ifdef __cplusplus
}
#endif
做一个干净的重建.
如果您的真实JNI胶水逻辑与此处介绍的版本一样微不足道,那么切换到它的C版本也可以是一种选择 – 但是请注意,JNI语法在C和C ++中有所不同,因此您不能只更改更改文件扩展名.
简单地执行本机C ++ –
之间的代码
extern "C" {
your code
}
并不总是一定会起作用的东西 – 您可以检查在这里.
尝试添加到android.mk文件:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
在这里您可以找到 info 关于它.
在我的情况下,我的项目正在正确构建,但是在我添加了两个新文件somefile.h和somefile.c之后,它开始给出”未定义的参考”错误.我将这些文件添加到了我构建的现有库的源目录中,因此参考新文件不需要CMAKE的更改.清洁和重建项目无效.但是,我对cmakelists.txt文件进行了一些冗余的更改,然后进行了干净的重建.构建成功.之后,我删除了此更改(因为它是多余的),并尝试再次进行清洁的重建,并且代码正常工作.也许构建系统正在从缓存中获取一些对象,并更改cmakelists.txt强迫它再次从头开始构建对象.如果有人知道为什么观察到这种行为,请告诉我.谢谢!
以上所述是小编给大家介绍的Android NDK/JNI-未定义的引用自定义标题文件中定义的函数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25757.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态