我正在尝试构建一个基于 Miracl 加密库(C/C++)的 Android 应用程序。我已将他们的来源和我的来源添加到 jni 文件夹。并编写了对加载 shared_library 并返回字符串的函数的简单调用(不调用 c++ 函数,只返回一个字符串)。但是应用程序在运行 A/libc 时崩溃?致命信号 11 (SIGSEGV),代码 1,tid 17711 中的故障地址 0x0
在 Windows 7/x64 Android Studio 1.1.0 Android r10d NDK 上工作
Application.mk
APP_PLATFORM := android-17
APP_ABI := armeabi-v7a
APP_STL := stlport_static
Android.mk
LOCAL_PATH := $(call my-dir)
# final lib, which will depend on others
include $(CLEAR_VARS)
LOCAL_CPPFLAGS := --std=c++11 -DMR_PAIRING_BLS
LOCAL_MODULE := CryptoLib
#find all the file recursively under jni/
LOCAL_C_INCLUDES := $(LOCAL_PATH)/miraclsources
LOCAL_CPP_EXTENSION := .cpp .c
LOCAL_SRC_FILES := miraclsources/mrcore.c \
miraclsources/mrarth0.c \
miraclsources/mrarth1.c \
miraclsources/mrarth2.c \
miraclsources/mralloc.c \
miraclsources/mrsmall.c \
miraclsources/mrio1.c \
miraclsources/mrio2.c \
miraclsources/mrgcd.c \
miraclsources/mrjack.c \
miraclsources/mrxgcd.c \
miraclsources/mrarth3.c \
miraclsources/mrbits.c \
miraclsources/mrrand.c \
miraclsources/mrprime.c \
miraclsources/mrcrt.c \
miraclsources/mrscrt.c \
miraclsources/mrmonty.c \
miraclsources/mrpower.c \
miraclsources/mrsroot.c \
miraclsources/mrcurve.c \
miraclsources/mrfast.c \
miraclsources/mrshs.c \
miraclsources/mrshs256.c \
miraclsources/mrshs512.c \
miraclsources/mrsha3.c \
miraclsources/mrfpe.c \
miraclsources/mraes.c \
miraclsources/mrgcm.c \
miraclsources/mrlucas.c \
miraclsources/mrzzn2.c \
miraclsources/mrzzn2b.c \
miraclsources/mrzzn3.c \
miraclsources/mrzzn4.c \
miraclsources/mrecn2.c \
miraclsources/mrstrong.c \
miraclsources/mrbrick.c \
miraclsources/mrebrick.c \
miraclsources/mrec2m.c \
miraclsources/mrgf2m.c \
miraclsources/mrflash.c \
miraclsources/mrfrnd.c \
miraclsources/mrdouble.c \
miraclsources/mrround.c \
miraclsources/mrbuild.c \
miraclsources/mrflsh1.c \
miraclsources/mrpi.c \
miraclsources/mrflsh2.c \
miraclsources/mrflsh3.c \
miraclsources/mrflsh4.c \
miraclsources/mrmuldv_android.c \
miraclsources/big.cpp \
miraclsources/zzn.cpp \
miraclsources/ecn.cpp \
miraclsources/ec2.cpp \
miraclsources/flash.cpp \
miraclsources/crt.cpp
LOCAL_SRC_FILES += miraclsources/zzn2.cpp \
miraclsources/zzn4.cpp \
miraclsources/zzn8.cpp \
miraclsources/zzn24.cpp \
miraclsources/bls_pair.cpp \
miraclsources/ecn4.cpp
LOCAL_SRC_FILES += sample.c
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_SRC_FILES += $(FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_LDLIBS := -llog
#LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)
main.cpp
#include "com_testproxy_NativeInterface.h"
#include <android/log.h>
/* Header for class com_testproxy_NativeInterface */
JNIEXPORT jstring JNICALL Java_com_testproxy_NativeInterface_getStringFromNative(JNIEnv *env, jobject obj)
{
return env -> NewStringUTF("Hello from JNI");
}
com_testproxy_NativeInterface.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_testproxy_NativeInterface */
#ifndef _Included_com_testproxy_NativeInterface
#define _Included_com_testproxy_NativeInterface
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_testproxy_NativeInterface
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_testproxy_NativeInterface_getStringFromNative
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
gradle part
ndk {
moduleName "CryptoLib"
}
}
sourceSets.main {
jni.srcDirs = [] //disable automatic ndk-build call (call ndk-build.cmd from terminal)
jniLibs.srcDir 'src/main/libs'
}
Java part
public class NativeInterface {
static {
System.loadLibrary("CryptoLib");
}
public native String getStringFromNative();
}
NativeInterface nativeInterface = new NativeInterface();
TextView textView = (TextView) findViewById(R.id.textview);
textView.setText(nativeInterface.getStringFromNative());
我使用命令 ndk-build.cmd NDK_DEBUG=1 NDK_LOG=1 构建
NDK stack trace is:
04-21 19:13:27.410 17711-17711/com.testproxy A/libc? Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 17711 (com.testproxy)
04-21 19:13:27.514 186-186/? I/DEBUG? *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
04-21 19:13:27.516 186-186/? I/DEBUG? Build fingerprint: 'google/hammerhead/hammerhead:5.1/LMY47I/1767468:user/release-keys'
04-21 19:13:27.517 186-186/? I/DEBUG? Revision: '11'
04-21 19:13:27.517 186-186/? I/DEBUG? ABI: 'arm'
04-21 19:13:27.517 186-186/? I/DEBUG? pid: 17711, tid: 17711, name: com.testproxy >>> com.testproxy <<<
04-21 19:13:27.517 186-186/? I/DEBUG? signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
04-21 19:13:27.558 186-186/? I/DEBUG? r0 00000000 r1 00000000 r2 00000000 r3 00000000
04-21 19:13:27.560 186-186/? I/DEBUG? r4 b4a32a60 r5 b4803128 r6 b47fe7e4 r7 b6fe9396
04-21 19:13:27.561 186-186/? I/DEBUG? r8 00000004 r9 b6fee714 sl 00000001 fp bea7c734
04-21 19:13:27.562 186-186/? I/DEBUG? ip 0000000d sp bea7c728 lr b358d820 pc b358d824 cpsr 60070010
04-21 19:13:27.564 186-186/? I/DEBUG? backtrace:
04-21 19:13:27.566 186-186/? I/DEBUG? #00 pc 00014824 /data/app/com.testproxy-1/lib/arm/libCryptoLib.so (negify(bigtype*, bigtype*)+36)
04-21 19:13:27.567 186-186/? I/DEBUG? #01 pc 00067650 /data/app/com.testproxy-1/lib/arm/libCryptoLib.so (operator-(int, Big const&)+88)
04-21 19:13:27.568 186-186/? I/DEBUG? #02 pc 0007b6f4 /data/app/com.testproxy-1/lib/arm/libCryptoLib.so (PFC::PFC(int, csprng*)+1336)
04-21 19:13:27.569 186-186/? I/DEBUG? #03 pc 000839e0 /data/app/com.testproxy-1/lib/arm/libCryptoLib.so (GeneralConstants::GeneralConstants(char*, int)+116)
04-21 19:13:27.569 186-186/? I/DEBUG? #04 pc 00084b90 /data/app/com.testproxy-1/lib/arm/libCryptoLib.so
04-21 19:13:27.570 186-186/? I/DEBUG? #05 pc 00084be4 /data/app/com.testproxy-1/lib/arm/libCryptoLib.so
04-21 19:13:27.570 186-186/? I/DEBUG? #06 pc 000015b5 /system/bin/linker (__dl__ZN6soinfo12CallFunctionEPKcPFvvE+44)
04-21 19:13:27.570 186-186/? I/DEBUG? #07 pc 00001689 /system/bin/linker (__dl__ZN6soinfo9CallArrayEPKcPPFvvEjb+140)
04-21 19:13:27.570 186-186/? I/DEBUG? #08 pc 0000185f /system/bin/linker (__dl__ZN6soinfo16CallConstructorsEv+142)
04-21 19:13:27.570 186-186/? I/DEBUG? #09 pc 00003259 /system/bin/linker (__dl__Z9do_dlopenPKciPK17android_dlextinfo+192)
04-21 19:13:27.571 186-186/? I/DEBUG? #10 pc 00000f1d /system/bin/linker (__dl__ZL10dlopen_extPKciPK17android_dlextinfo+24)
04-21 19:13:27.571 186-186/? I/DEBUG? #11 pc 001e102d /system/lib/libart.so (art::JavaVMExt::LoadNativeLibrary(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, art::Handle<art::mirror::ClassLoader>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*)+544)
04-21 19:13:27.572 186-186/? I/DEBUG? #12 pc 00207b13 /system/lib/libart.so (art::Runtime_nativeLoad(_JNIEnv*, _jclass*, _jstring*, _jobject*, _jstring*)+514)
04-21 19:13:27.573 186-186/? I/DEBUG? #13 pc 000797f5 /data/dalvik-cache/arm/system@framework@boot.oat
04-21 19:13:27.910 186-186/? I/DEBUG? Tombstone written to: /data/tombstones/tombstone_06
04-21 19:13:27.916 724-815/? I/BootReceiver? Copying /data/tombstones/tombstone_06 to DropBox (SYSTEM_TOMBSTONE)
04-21 19:13:27.924 200-200/? I/Zygote? Process 17711 exited due to signal (11)
但我什至不调用这些函数。编译没问题,有一些警告。如何调试它?