Search code examples
androidc++android-ndkjava-native-interfacewebrtc

webrtc static android library can't export jni functions


I planning to use webrtc native in our library. The my library will be used by Android.

I've success build libwebrtc.a for android, using https://webrtc.github.io/webrtc-org/native-code/android/ link.

And I added it to Android.mk as pre-build static library.

# add webrtc
include $(CLEAR_VARS)
LOCAL_CFLAGS += -DWEBRTC_POSIX -DANDROID_BUILD
LOCAL_MODULE := webrtc
LOCAL_SRC_FILES := $(WEBRTC_ANDROID_LIBRARY)/$(TARGET_ARCH_ABI)/obj/libwebrtc.a
LOCAL_EXPORT_C_INCLUDES := $(WEBRTC_ANDROID_INCLUDE)/
include $(PREBUILT_STATIC_LIBRARY)

And my library configuration is:

LOCAL_MODULE := mylibrary
#  Release Build

LOCAL_CPPFLAGS += -std=c++20 -O2 -Os -Wall -Wpedantic  -fPIC -fvisibility=hidden -frtti -flto=full


LOCAL_CPPFLAGS += -ffunction-sections -fdata-sections
LOCAL_CFLAGS += -ffunction-sections -fdata-sections 
LOCAL_LDFLAGS += -flto=full -Wl,--gc-sections

#linking to shared and static libraries
LOCAL_STATIC_LIBRARIES := webrtc 

LOCAL_CPP_EXTENSION := .cpp .cc

LOCAL_LDLIBS := -llog -lOpenSLES

LOCAL_SRC_FILES := < a lot of my cpp files>

LOCAL_CPP_FEATURES := exceptions

include $(BUILD_SHARED_LIBRARY)

libwebrtc.a have a lot of jni functions.

$ ~/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-nm libwebrtc.a | grep Java_org_webrtc_
0000000000000000 T Java_org_webrtc_Histogram_nativeAddSample
0000000000000000 T Java_org_webrtc_Histogram_nativeCreateCounts
0000000000000000 T Java_org_webrtc_Histogram_nativeCreateEnumeration
0000000000000000 T Java_org_webrtc_NetworkMonitor_nativeNotifyConnectionTypeChanged
0000000000000000 T Java_org_webrtc_NetworkMonitor_nativeNotifyOfActiveNetworkList
0000000000000000 T Java_org_webrtc_NetworkMonitor_nativeNotifyOfNetworkConnect
0000000000000000 T Java_org_webrtc_NetworkMonitor_nativeNotifyOfNetworkDisconnect
0000000000000000 T Java_org_webrtc_NetworkMonitor_nativeNotifyOfNetworkPreference
0000000000000000 T Java_org_webrtc_JniCommon_nativeAddRef
0000000000000000 T Java_org_webrtc_JniCommon_nativeAllocateByteBuffer
0000000000000000 T Java_org_webrtc_JniCommon_nativeFreeByteBuffer
0000000000000000 T Java_org_webrtc_JniCommon_nativeReleaseRef
0000000000000000 T Java_org_webrtc_Logging_nativeEnableLogThreads
0000000000000000 T Java_org_webrtc_Logging_nativeEnableLogTimeStamps
0000000000000000 T Java_org_webrtc_Logging_nativeEnableLogToDebugOutput
0000000000000000 T Java_org_webrtc_Logging_nativeLog
0000000000000000 T Java_org_webrtc_BuiltinAudioDecoderFactoryFactory_nativeCreateBuiltinAudioDecoderFactory
0000000000000000 T Java_org_webrtc_BuiltinAudioEncoderFactoryFactory_nativeCreateBuiltinAudioEncoderFactory
0000000000000000 T Java_org_webrtc_LibaomAv1Decoder_nativeCreateDecoder
0000000000000000 T Java_org_webrtc_LibaomAv1Decoder_nativeIsSupported
0000000000000000 T Java_org_webrtc_LibaomAv1Encoder_nativeCreateEncoder
0000000000000000 T Java_org_webrtc_LibaomAv1Encoder_nativeIsSupported
0000000000000000 T Java_org_webrtc_NativeAndroidVideoTrackSource_nativeAdaptFrame
0000000000000000 T Java_org_webrtc_NativeAndroidVideoTrackSource_nativeAdaptOutputFormat
0000000000000000 T Java_org_webrtc_NativeAndroidVideoTrackSource_nativeOnFrameCaptured
0000000000000000 T Java_org_webrtc_NativeAndroidVideoTrackSource_nativeSetIsScreencast
0000000000000000 T Java_org_webrtc_NativeAndroidVideoTrackSource_nativeSetState
0000000000000000 T Java_org_webrtc_H264Utils_nativeIsSameH264Profile
0000000000000000 T Java_org_webrtc_JavaI420Buffer_nativeCropAndScaleI420
0000000000000000 T Java_org_webrtc_NV12Buffer_nativeCropAndScale
0000000000000000 T Java_org_webrtc_NV21Buffer_nativeCropAndScale
0000000000000000 T Java_org_webrtc_TimestampAligner_nativeCreateTimestampAligner
0000000000000000 T Java_org_webrtc_TimestampAligner_nativeReleaseTimestampAligner
0000000000000000 T Java_org_webrtc_TimestampAligner_nativeRtcTimeNanos
0000000000000000 T Java_org_webrtc_TimestampAligner_nativeTranslateTimestamp
0000000000000000 T Java_org_webrtc_VideoDecoderFallback_nativeCreateDecoder
0000000000000000 T Java_org_webrtc_VideoDecoderWrapper_nativeOnDecodedFrame
0000000000000000 T Java_org_webrtc_VideoEncoderFallback_nativeCreateEncoder
0000000000000000 T Java_org_webrtc_VideoEncoderWrapper_nativeOnEncodedFrame
0000000000000000 T Java_org_webrtc_VideoTrack_nativeAddSink
0000000000000000 T Java_org_webrtc_VideoTrack_nativeFreeSink
0000000000000000 T Java_org_webrtc_VideoTrack_nativeRemoveSink
0000000000000000 T Java_org_webrtc_VideoTrack_nativeWrapSink
0000000000000000 T Java_org_webrtc_YuvHelper_nativeABGRToI420
0000000000000000 T Java_org_webrtc_YuvHelper_nativeCopyPlane
0000000000000000 T Java_org_webrtc_YuvHelper_nativeI420Copy
0000000000000000 T Java_org_webrtc_YuvHelper_nativeI420Rotate
0000000000000000 T Java_org_webrtc_YuvHelper_nativeI420ToNV12
0000000000000000 T Java_org_webrtc_LibvpxVp8Decoder_nativeCreateDecoder
0000000000000000 T Java_org_webrtc_LibvpxVp8Encoder_nativeCreateEncoder
0000000000000000 T Java_org_webrtc_LibvpxVp9Decoder_nativeCreateDecoder
0000000000000000 T Java_org_webrtc_LibvpxVp9Decoder_nativeIsSupported
0000000000000000 T Java_org_webrtc_LibvpxVp9Encoder_nativeCreateEncoder
0000000000000000 T Java_org_webrtc_LibvpxVp9Encoder_nativeIsSupported
0000000000000000 T Java_org_webrtc_audio_JavaAudioDeviceModule_nativeCreateAudioDeviceModule
0000000000000000 T Java_org_webrtc_audio_WebRtcAudioRecord_nativeCacheDirectBufferAddress
0000000000000000 T Java_org_webrtc_audio_WebRtcAudioRecord_nativeDataIsRecorded
0000000000000000 T Java_org_webrtc_audio_WebRtcAudioTrack_nativeCacheDirectBufferAddress
0000000000000000 T Java_org_webrtc_audio_WebRtcAudioTrack_nativeGetPlayoutData
0000000000000000 T Java_org_webrtc_AudioTrack_nativeSetVolume
0000000000000000 T Java_org_webrtc_CallSessionFileRotatingLogSink_nativeAddSink
0000000000000000 T Java_org_webrtc_CallSessionFileRotatingLogSink_nativeDeleteSink
0000000000000000 T Java_org_webrtc_CallSessionFileRotatingLogSink_nativeGetLogData
0000000000000000 T Java_org_webrtc_DataChannel_nativeBufferedAmount
0000000000000000 T Java_org_webrtc_DataChannel_nativeClose
0000000000000000 T Java_org_webrtc_DataChannel_nativeId
0000000000000000 T Java_org_webrtc_DataChannel_nativeLabel
0000000000000000 T Java_org_webrtc_DataChannel_nativeRegisterObserver
0000000000000000 T Java_org_webrtc_DataChannel_nativeSend
0000000000000000 T Java_org_webrtc_DataChannel_nativeState
0000000000000000 T Java_org_webrtc_DataChannel_nativeUnregisterObserver
0000000000000000 T Java_org_webrtc_DtmfSender_nativeCanInsertDtmf
0000000000000000 T Java_org_webrtc_DtmfSender_nativeDuration
0000000000000000 T Java_org_webrtc_DtmfSender_nativeInsertDtmf
0000000000000000 T Java_org_webrtc_DtmfSender_nativeInterToneGap
0000000000000000 T Java_org_webrtc_DtmfSender_nativeTones
0000000000000000 T Java_org_webrtc_MediaSource_nativeGetState
0000000000000000 T Java_org_webrtc_MediaStream_nativeAddAudioTrackToNativeStream
0000000000000000 T Java_org_webrtc_MediaStream_nativeAddVideoTrackToNativeStream
0000000000000000 T Java_org_webrtc_MediaStream_nativeGetId
0000000000000000 T Java_org_webrtc_MediaStream_nativeRemoveAudioTrack
0000000000000000 T Java_org_webrtc_MediaStream_nativeRemoveVideoTrack
0000000000000000 T Java_org_webrtc_MediaStreamTrack_nativeGetEnabled
0000000000000000 T Java_org_webrtc_MediaStreamTrack_nativeGetId
0000000000000000 T Java_org_webrtc_MediaStreamTrack_nativeGetKind
0000000000000000 T Java_org_webrtc_MediaStreamTrack_nativeGetState
0000000000000000 T Java_org_webrtc_MediaStreamTrack_nativeSetEnabled
0000000000000000 T Java_org_webrtc_PeerConnection_nativeAddIceCandidate
0000000000000000 T Java_org_webrtc_PeerConnection_nativeAddIceCandidateWithObserver
0000000000000000 T Java_org_webrtc_PeerConnection_nativeAddLocalStream
0000000000000000 T Java_org_webrtc_PeerConnection_nativeAddTrack
0000000000000000 T Java_org_webrtc_PeerConnection_nativeAddTransceiverOfType
0000000000000000 T Java_org_webrtc_PeerConnection_nativeAddTransceiverWithTrack
0000000000000000 T Java_org_webrtc_PeerConnection_nativeClose
0000000000000000 T Java_org_webrtc_PeerConnection_nativeConnectionState
0000000000000000 T Java_org_webrtc_PeerConnection_nativeCreateAnswer
0000000000000000 T Java_org_webrtc_PeerConnection_nativeCreateDataChannel
0000000000000000 T Java_org_webrtc_PeerConnection_nativeCreateOffer
0000000000000000 T Java_org_webrtc_PeerConnection_nativeCreatePeerConnectionObserver
0000000000000000 T Java_org_webrtc_PeerConnection_nativeCreateSender
0000000000000000 T Java_org_webrtc_PeerConnection_nativeFreeOwnedPeerConnection
0000000000000000 T Java_org_webrtc_PeerConnection_nativeGetCertificate
0000000000000000 T Java_org_webrtc_PeerConnection_nativeGetLocalDescription
0000000000000000 T Java_org_webrtc_PeerConnection_nativeGetNativePeerConnection
0000000000000000 T Java_org_webrtc_PeerConnection_nativeGetReceivers
0000000000000000 T Java_org_webrtc_PeerConnection_nativeGetRemoteDescription
0000000000000000 T Java_org_webrtc_PeerConnection_nativeGetSenders
0000000000000000 T Java_org_webrtc_PeerConnection_nativeGetTransceivers
0000000000000000 T Java_org_webrtc_PeerConnection_nativeIceConnectionState
0000000000000000 T Java_org_webrtc_PeerConnection_nativeIceGatheringState
0000000000000000 T Java_org_webrtc_PeerConnection_nativeNewGetStats
0000000000000000 T Java_org_webrtc_PeerConnection_nativeOldGetStats
0000000000000000 T Java_org_webrtc_PeerConnection_nativeRemoveIceCandidates
0000000000000000 T Java_org_webrtc_PeerConnection_nativeRemoveLocalStream
0000000000000000 T Java_org_webrtc_PeerConnection_nativeRemoveTrack
0000000000000000 T Java_org_webrtc_PeerConnection_nativeRestartIce
0000000000000000 T Java_org_webrtc_PeerConnection_nativeSetAudioPlayout
0000000000000000 T Java_org_webrtc_PeerConnection_nativeSetAudioRecording
0000000000000000 T Java_org_webrtc_PeerConnection_nativeSetBitrate
0000000000000000 T Java_org_webrtc_PeerConnection_nativeSetConfiguration
0000000000000000 T Java_org_webrtc_PeerConnection_nativeSetLocalDescription
0000000000000000 T Java_org_webrtc_PeerConnection_nativeSetLocalDescriptionAutomatically
0000000000000000 T Java_org_webrtc_PeerConnection_nativeSetRemoteDescription
0000000000000000 T Java_org_webrtc_PeerConnection_nativeSignalingState
0000000000000000 T Java_org_webrtc_PeerConnection_nativeStartRtcEventLog
0000000000000000 T Java_org_webrtc_PeerConnection_nativeStopRtcEventLog
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeCreateAudioSource
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeCreateAudioTrack
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeCreateLocalMediaStream
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeCreatePeerConnection
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeCreatePeerConnectionFactory
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeCreateVideoSource
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeCreateVideoTrack
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeDeleteLoggable
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeFindFieldTrialsFullName
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeFreeFactory
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeGetNativePeerConnectionFactory
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeInitializeAndroidGlobals
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeInitializeFieldTrials
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeInitializeInternalTracer
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeInjectLoggable
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativePrintStackTrace
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativePrintStackTracesOfRegisteredThreads
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeShutdownInternalTracer
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeStartAecDump
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeStartInternalTracingCapture
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeStopAecDump
0000000000000000 T Java_org_webrtc_PeerConnectionFactory_nativeStopInternalTracingCapture
0000000000000000 T Java_org_webrtc_RtcCertificatePem_nativeGenerateCertificate
0000000000000000 T Java_org_webrtc_RtpReceiver_nativeGetId
0000000000000000 T Java_org_webrtc_RtpReceiver_nativeGetParameters
0000000000000000 T Java_org_webrtc_RtpReceiver_nativeGetTrack
0000000000000000 T Java_org_webrtc_RtpReceiver_nativeSetFrameDecryptor
0000000000000000 T Java_org_webrtc_RtpReceiver_nativeSetObserver
0000000000000000 T Java_org_webrtc_RtpReceiver_nativeUnsetObserver
0000000000000000 T Java_org_webrtc_RtpSender_nativeGetDtmfSender
0000000000000000 T Java_org_webrtc_RtpSender_nativeGetId
0000000000000000 T Java_org_webrtc_RtpSender_nativeGetParameters
0000000000000000 T Java_org_webrtc_RtpSender_nativeGetStreams
0000000000000000 T Java_org_webrtc_RtpSender_nativeGetTrack
0000000000000000 T Java_org_webrtc_RtpSender_nativeSetFrameEncryptor
0000000000000000 T Java_org_webrtc_RtpSender_nativeSetParameters
0000000000000000 T Java_org_webrtc_RtpSender_nativeSetStreams
0000000000000000 T Java_org_webrtc_RtpSender_nativeSetTrack
0000000000000000 T Java_org_webrtc_RtpTransceiver_nativeCurrentDirection
0000000000000000 T Java_org_webrtc_RtpTransceiver_nativeDirection
0000000000000000 T Java_org_webrtc_RtpTransceiver_nativeGetMediaType
0000000000000000 T Java_org_webrtc_RtpTransceiver_nativeGetMid
0000000000000000 T Java_org_webrtc_RtpTransceiver_nativeGetReceiver
0000000000000000 T Java_org_webrtc_RtpTransceiver_nativeGetSender
0000000000000000 T Java_org_webrtc_RtpTransceiver_nativeSetDirection
0000000000000000 T Java_org_webrtc_RtpTransceiver_nativeStopInternal
0000000000000000 T Java_org_webrtc_RtpTransceiver_nativeStopStandard
0000000000000000 T Java_org_webrtc_RtpTransceiver_nativeStopped
0000000000000000 T Java_org_webrtc_TurnCustomizer_nativeFreeTurnCustomizer

But mylibrary.so file have a piece of this list:

home:arm64-v8a$ ~/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-nm libmylibrary.so | grep Java_org_webrtc_
00000000009e9898 T Java_org_webrtc_NativeAndroidVideoTrackSource_nativeAdaptFrame
00000000009e9758 T Java_org_webrtc_NativeAndroidVideoTrackSource_nativeAdaptOutputFormat
00000000009e9a68 T Java_org_webrtc_NativeAndroidVideoTrackSource_nativeOnFrameCaptured
00000000009e9688 T Java_org_webrtc_NativeAndroidVideoTrackSource_nativeSetIsScreencast
00000000009e969c T Java_org_webrtc_NativeAndroidVideoTrackSource_nativeSetState

Question: How can add other Java_org_webrtc_ jni functions to libmylibrary.so* ?


Solution

  • For me this line solve my problem: Add this line to Android.mk

    LOCAL_WHOLE_STATIC_LIBRARIES := webrtc
    

    Remove webrtc from LOCAL_STATIC_LIBRARIES.