Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android NDK - Library not found CANNOT LINK EXECUTABLE - how to set LD_LIBRARY_PATH?

Tags:

android

I have an Android activity where I'm executing NDK compiled code (command line program) with:

Runtime.getRuntime().exec(myCommand);

and load the needed shared libraries with:

static {
    System.loadLibrary(myLib);
}

but when running my project and printing the output from error stream I get the following error:

link_image[1963]:  7520 could not load needed library 'libmyLib.so' for './myCommand'
(load_library[1105]: Library 'libmyLib.so' not found)CANNOT LINK EXECUTABLE

I assure libmyLib.so does exist in my project under libs/armeabi/ directory and it's copied to my Android device under /data/data/myProject.path.package/lib/ directory. Owner and group of both executable and library are system:system and permissions are ok as well.

When executing the command from adb shell in the beginning I get the same error but then I can set LD_LIBRARY_PATH and it runs ok:

./adb shell
export LD_LIBRARY_PATH=/data/data/myProject.path.package/lib:$LD_LIBRARY_PATH
/data/data/myProject.path.package/myCommand

So the question is, how to do that from java Android project?

Note: I'm using Linux, Eclipse + Sequoyah, NDK-r5b, Android 2.3.6 (API 10) on GT-P1010.

like image 651
julialecat Avatar asked Apr 27 '12 09:04

julialecat


1 Answers

Solved: you can use exec(String prog, String[] envp). In my case this was:

String[] envp = {"LD_LIBRARY_PATH=/data/data/cse.ecg.dcmtk/lib:$LD_LIBRARY_PATH"};
Runtime.getRuntime().exec(myCommand, envp);

The issue now is that with exec() the process executed can't resolve hostnames (it does from adb shell; Internet permission is set). Any hint about that?

like image 139
julialecat Avatar answered Nov 10 '22 01:11

julialecat