android 调用非jni 库,android – 使用JNI访问我的共享库时的“未...

博主在尝试在Android应用中使用JNI集成C加密库Botan时遇到了编译错误。错误主要涉及未定义的引用到Botan库的初始化和析构函数。在Android.mk和Application.mk文件中已经设置了相应配置,但仍然无法成功链接。博客讨论了可能的错误来源和解决策略,包括检查库文件是否包含所需函数,以及确认编译选项和依赖库设置是否正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在尝试使用JNI在Android上运行一些本机C程序来构建Botan版本(加密算法库).

我设法使用NDK工具链(NDK R5b)创建了一个没有任何错误的libbotan.so.

但是当我从我的Android项目(示例)编译我的源文件(exampleError.cpp)时,我收到以下错误:

Android NDK: WARNING: Unsupported source file extensions in /home/fensta/workspace

/Example/jni/Android.mk for module botan

Android NDK: sources

Android NDK: WARNING: Unsupported source file extensions in /home/fensta/workspace

/Example/jni/Android.mk for module botan

Android NDK: sources

Install : libbotan.so => libs/armeabi/libbotan.so

Compile++ thumb : fooBar <= exampleError.cpp

SharedLibrary : libfooBar.so

/home/fensta/workspace/Example/obj/local/armeabi/objs/fooBar/exampleError.o: In

function `LibraryInitializer':

/home/fensta/workspace/Example/jni/botan/botan_all.h:5593: undefined reference to `

Botan::LibraryInitializer::initialize(std::basic_string,

std::allocator > const&)'

/home/fensta/workspace/Example/obj/local/armeabi/objs/fooBar/exampleError.o: In

function `~LibraryInitializer':

/home/fensta/workspace/Example/jni/botan/botan_all.h:5595: undefined reference to `

Botan::LibraryInitializer::deinitialize()'

/home/fensta/workspace/Example/jni/botan/botan_all.h:5595: undefined reference to `

Botan::LibraryInitializer::deinitialize()'

/home/fensta/workspace/Example/obj/local/armeabi/objs/fooBar/exampleError.o: In

function `~LibraryInitializer':

/home/fensta/Programs/android-ndk-r5b/sources/cxx-stl/stlport/stlport

/stl/_string_base.h:156: undefined reference to `

Botan::LibraryInitializer::deinitialize()'

collect2: ld returned 1 exit status

make: *** [/home/fensta/workspace/Example/obj/local/armeabi/libfooBar.so] Error 1

这是我的exampletError.cpp:

#include

#include

#include

using namespace Botan;

JNIEXPORT void JNICALL Java_test_example_example_simpleTestCall (JNIEnv *env, jobject

object){

LibraryInitializer init;//

}

这是相应的Java类createError.java:

????private native void simpleTestCall();

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

...

simpleTestCall();

}

在这里你可以看到Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := libbotan

LOCAL_CPPFLAGS += -fexceptions

LOCAL_SRC_FILES := sources

LOCAL_C_INCLUDES := includes

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := fooBar

LOCAL_SRC_FILES := exampleError.cpp

LOCAL_SHARED_LIBRARIES:=

libbotan

LOCAL_CPPFLAGS += -fexceptions

include $(BUILD_SHARED_LIBRARY)

最后,但并非最不重要的Application.mk:

APP_ABI := armeabi armeabi-v7a

APP_PROJECT_PATH := /home/fensta/workspace/Example

APP_STL := stlport_shared

注意:JNI文件夹的结构如下:

Android.mk

Application.mk

牡丹/ botan_all.h

来源/ botan_all.cpp

exampleError.cpp

我还检查了libbotan.so的内容,如下所示:

/workspace/Example/obj/local/armeabi$nm libbotan.so

00001234 a _DYNAMIC

000012bc a _GLOBAL_OFFSET_TABLE_

000012c8 A __bss_end__

000012c8 A __bss_start

000012c8 A __bss_start__

000012c8 D __data_start

000012c8 A __end__

00000233 A __exidx_end

00000233 A __exidx_start

000012c8 A _bss_end__

000012c8 A _edata

000012c8 A _end

但是我不知道在这个输出中是否可以看到任何错误.

此外,我还在网上搜索了这个错误,例如here.

不幸的是我还没能解决我的问题.

所以我的问题是:我做错了什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值