you do realize that your NativeCpp.so doesn't have a "ret_mul" symbol at all, hence the link error ?
On Fri, May 30, 2008 at 11:31 AM, Ashutosh Malviya <[EMAIL PROTECTED]> wrote: > Hello All, > > I am trying to call an API in a C++ library libNativeCpp.so and Android > does not load it. The error is -- > > DEBUG/dalvikvm(1185): LOADING path /system/lib/libNativeCpp.so 0x4001f6e8 > INFO/dalvikvm(1185): Unable to dlopen(/system/lib/libNativeCpp.so): Cannot > find library > > I have used arm-2008q1/bin/arm-none-linux-gnueabi-gcc, > arm-2008q1/bin/arm-none-linux-gnueabi-g++ for compilation. > > How I tried to do it, is explained below -- > > I have gone through the URL > http://davanum.wordpress.com/2007/12/09/android-invoke-jni-based-methods-bridging-cc-and-java/and > have been able to run the program successfully. > > After this I have made some changes in the source code. > 1) I have changed signature of function add() in class NativeAdd. It is now > 'public static native long add(int a, int b)'. > 2) I have changed function Java_org_apache_NativeAdd_add() in file > org_apache_NativeAdd.c. It now looks like -- > > #include "org_apache_NativeAdd.h" > > JNIEXPORT jlong JNICALL Java_org_apache_NativeAdd_add > (JNIEnv *env, jclass c, jint a, jint b) > { > long aa; > aa = ret_mul(a, b); > // aa = ret_mul_cpp(a, b); > return aa; > } > > The function ret_mul() is written in another file called NativeC.c. Content > of file is -- > #include <stdio.h> > int ret_mul(int a, int b) > { > return (a * b); > } > > Now I compile these files and create libraries -- > > arm-none-linux-gnueabi-gcc -I /usr/java/jdk1.6.0_04/include -I > /usr/java/jdk1.6.0_04/include/linux -fpic -c org_apache_NativeAdd.c > arm-none-linux-gnueabi-ld -T armelf_linux_eabi.xsc -shared -o > libNativeAdd.so org_apache_NativeAdd.o > > > arm-none-linux-gnueabi-gcc -fpic -c NativeC.c > arm-none-linux-gnueabi-ld -T armelf_linux_eabi.xsc -shared -o libNativeC.so > NativeC.o > > The file armelf_linux_eabi.xsc is modified as per the suggestion on the URL > > http://honeypod.blogspot.com/2007/12/shared-library-hello-world-for-android.html. > > I pushed the library to android environment -- > adb push libNativeAdd.so /system/lib > adb push libNativeC.so /system/lib > > I have created an android project CallNative1 and in file NativeAdd.java, I > am loading libraries as below -- > System.loadLibrary("NativeC"); > System.loadLibrary("NativeAdd"); > > When I run the project CallNative1, it prints the result as multiplication > of two integers. > > Now I write the same ret_mul() function in NativeCpp.cpp. Content of > NativeCpp.cpp is -- > > #include <iostream> > int ret_mul_cpp(int a, int b) > { > return (a * b); > } > > Compiled it -- > > arm-none-linux-gnueabi-g++ -fpic -c NativeCpp.cpp > arm-none-linux-gnueabi-ld -T armelf_linux_eabi.xsc -shared -o > libNativeCpp.so NativeCpp.o > > Pushed the library -- > > adb push libNativeCpp.so /system/lib > > Now loading libraries as below -- > > System.loadLibrary("NativeCpp"); > System.loadLibrary("NativeAdd"); > > > When I run CallNative1 again I can see below errors in logcat. > > DEBUG/dalvikvm(1185): LOADING path /system/lib/libNativeCpp.so 0x4001f6e8 > INFO/dalvikvm(1185): Unable to dlopen(/system/lib/libNativeCpp.so): Cannot > find library > > > Below are the information about symbols in both the libraries -- > > > arm-none-linux-gnueabi-nm libNativeC.so > 00000244 a _DYNAMIC > 0000029c a _GLOBAL_OFFSET_TABLE_ > 000002a8 A __bss_end__ > 000002a8 A __bss_start > 000002a8 A __bss_start__ > 000002a8 D __data_start > 000002a8 A __end__ > 00000244 A __exidx_end > 00000244 A __exidx_start > 000002a8 A _bss_end__ > 000002a8 A _edata > 000002a8 A _end > 00000214 T ret_mul > > > arm-none-linux-gnueabi-nm libNativeCpp.so > ========================================= > 000007a0 a _DYNAMIC > 00000840 a _GLOBAL_OFFSET_TABLE_ > 000006ec t _GLOBAL__I__Z11ret_mul_cppii > 00000460 T _Z11ret_mul_cppii > 00000640 t _Z41__static_initialization_and_destruction_0ii > U _ZNKSs4sizeEv > U _ZNKSsixEj > U _ZNSt8ios_base4InitC1Ev > U _ZNSt8ios_base4InitD1Ev > 00000490 t _ZSt17__verify_groupingPKcjRKSs > 00000708 W _ZSt3minIjERKT_S2_S2_ > 00000868 b _ZSt8__ioinit > U __aeabi_atexit > U __aeabi_unwind_cpp_pr0 > U __aeabi_unwind_cpp_pr1 > 0000086c A __bss_end__ > 00000868 A __bss_start > 00000868 A __bss_start__ > 00000868 B __data_start > U __dso_handle > 0000086c A __end__ > 0000079c A __exidx_end > 00000774 A __exidx_start > 0000086c A _bss_end__ > 00000868 A _edata > 0000086c A _end > > I have gonn through the discussion at > http://groups.google.com/group/android-internals/browse_thread/thread/780ba5316409cf5dand > I also feel that the problem is with unresolved symbols. > > I pulled whole /system directory from Android and tried to grep one of the > undefined symbols _ZNKSs4sizeEv, in /system but could not find it. But if I > grep them in arm-2008q1 directory I find many matches. > > grep -r _ZNKSs4sizeEv arm-2008q1/* > Binary file > arm-2008q1/arm-none-linux-gnueabi/libc/armv4t/usr/lib/libstdc++.so.6 matches > Binary file > arm-2008q1/arm-none-linux-gnueabi/libc/armv4t/usr/lib/libstdc++.a matches > Binary file > arm-2008q1/arm-none-linux-gnueabi/libc/armv4t/usr/lib/libstdc++.so.6.0.9 > matches > Binary file > arm-2008q1/arm-none-linux-gnueabi/libc/armv4t/usr/lib/libstdc++.so matches > Binary file > arm-2008q1/arm-none-linux-gnueabi/libc/thumb2/usr/lib/libstdc++.so.6 matches > Binary file > arm-2008q1/arm-none-linux-gnueabi/libc/thumb2/usr/lib/libstdc++.a matches > Binary file > arm-2008q1/arm-none-linux-gnueabi/libc/thumb2/usr/lib/libstdc++.so.6.0.9 > matches > Binary file > arm-2008q1/arm-none-linux-gnueabi/libc/thumb2/usr/lib/libstdc++.so matches > Binary file arm-2008q1/arm-none-linux-gnueabi/libc/usr/lib/libstdc++.so.6 > matches > Binary file arm-2008q1/arm-none-linux-gnueabi/libc/usr/lib/libstdc++.a > matches > Binary file > arm-2008q1/arm-none-linux-gnueabi/libc/usr/lib/libstdc++.so.6.0.9 matches > Binary file arm-2008q1/arm-none-linux-gnueabi/libc/usr/lib/libstdc++.so > matches > > I don't know why these symbols are not there in /system/lib at android. > Statically linking a C++ library is not advisable. > > Could anyone please suggest me how do I go about it ? > > Thanks > Ashutosh > > > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Beginners" group. To post to this group, send email to android-beginners@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] Announcing the new M5 SDK! http://android-developers.blogspot.com/2008/02/android-sdk-m5-rc14-now-available.html For more options, visit this group at http://groups.google.com/group/android-beginners?hl=en -~----------~----~----~----~------~----~------~--~---