Android NDK Connection

I am trying to create an android application that is called on a C ++ backend. This backend uses ZeroMQ for messaging. On the Android build page page in the ZeroMQ manual, I created my own ndk version 6 binding and used it to (successfully) build ZeroMQ.

However, when I create my own .so with JNI implementations, I cannot get everything to load correctly. In particular, if I call System.LoadLibrary ("zmq"), it succeeds, but if I then call * System.LoadLibrary ("my_lib") *, I always get an UnsatisfiedLinkError complaining that:

Cannot load library reloc_library[1244]: 29 cannot locate zmq_msg_init'... 

libmy_lib.so was created in several different ways, each of which is unsuccessful. After generation, I always copy libmy_lib.so (as well as libzmq.so) into my Android project folder: libs / armeabi /.

 # Compile all object files - this part was done for all options /opt/android-toolchain/bin/arm-linux-androideabi-g++ -fpic -c Client_Events.cpp \ Client Wrapper.cpp jni.cpp -I /opt/android-root/include/ -I /my/project/specific/stuff # Option 1 - Don't link the lib in at all /opt/android-toolchain/bin/arm-linux-androideabi-g++ -shared \ -Wl,-soname,libmy_lib.so -o libmy_lib.so jni.o Client_Events.o Client_Wrapper.o # Option 2 - Link ZeroMQ in statically /opt/android-toolchain/bin/arm-linux-androideabi-g++ -shared \ -Wl,-soname,libmy_lib.so -o libmy_lib.so jni.o Client_Events.o Client_Wrapper.o \ libzmq.a libstdc++.a -Wl,--whole-archive # Option 3 - Explicitly link ZeroMQ in dynamically /opt/android-toolchain/bin/arm-linux-androideabi-g++ -shared \ -Wl,-soname,libmy_lib.so -o libmy_lib.so jni.o Client_Events.o Client_Wrapper.o \ -L /opt/android-root/lib/ -lzmq 

With each of these options, I tried to explicitly call System.LoadLibrary ("zmq") before loading my own library, not. Nothing changed the results. Using nm confirms that, at least in the case of option # 2, the missing * zmq_msg_init * character is indeed present in libmy_lib.so.

Any ideas as to why he cannot find the ZeroMQ characters that are related in?

+4
source share
1 answer

I just learned how to compile a second library and link it to my main library in android ndk. Let me see how useful I am to you.

Next, I create my second library (in my case, I create the bullet physics library and the irrlicht rendering engine as two separate libraries for my game).

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_C_INCLUDES := HEADER FILES LOCAL_MODULE := bullet LOCAL_SRC_FILES := SRC FILES LOCAL_ARM_MODE := arm LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) -O3 -DANDROID_NDK -DDISABLE_IMPORTGL LOCAL_LDLIBS := -ldl -llog include $(BUILD_SHARED_LIBRARY) 

Then copy the file libxxxx.so (in my case libbullet.so and libirrlicht.so) to the jni folder. And in the main library of the .mk file, add the following.

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_C_INCLUDES := (includes for bullet) LOCAL_MODULE := bullet LOCAL_SRC_FILES := libbullet.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_C_INCLUDES := (includes for irrlicht) LOCAL_MODULE := irrlicht LOCAL_SRC_FILES := libirrlicht.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_C_INCLUDES := (includes for bullet + includes for irrlicht + includes for main code) LOCAL_SRC_FILES := main code src files LOCAL_MODULE := gamescript LOCAL_ARM_MODE := arm LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) -O3 -DANDROID_NDK -DDISABLE_IMPORTGL LOCAL_LDLIBS := -lOpenSLES -landroid -ldl -llog LOCAL_SHARED_LIBRARIES := bullet irrlicht include $(BUILD_SHARED_LIBRARY) 

And now add all the libraries to your Java code in the correct order.

 System.loadLibrary("bullet"); System.loadLibrary("irrlicht"); System.loadLibrary("gamescript"); 
+13
source

Source: https://habr.com/ru/post/917329/


All Articles