I'm doing the following tutorial http://mobile.tutsplus.com/tutorials/android/ndk-tutorial/.
And I can't seem to compile properly. I get the following error:
dyld: unknown required load command 0x80000022
dyld: unknown required load command 0x80000022
Compile thumb : ndk1 <= native.c
dyld: unknown required load command 0x80000022
make: *** [obj/local/armeabi/objs/ndk1/native.o] Trace/BPT trap
I'm running Mac OS X 10.5.8. I'm using Gnu Make 3.81. I'm using the awk that ships with mac os x. And I'm using android ndk r7b.
The dyld error seems to pop up with a lot of code compiled for 10.6 and then tried on a 10.5.8 machine.
Android.mk make file:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog
LOCAL_MODULE := ndk1
LOCAL_SRC_FILES := native.c
include $(BUILD_SHARED_LIBRARY)
native.c file:
#include <jni.h>
#include <string.h>
#include <android/log.h>
#define DEBUG_TAG "NDK_NDKtestActivity"
void Java_my_mumbo_jumbo_NDKtestActivity_helloLog(JNIEnv * env, jobject this, j\
string logThis)
{
jboolean isCopy;
const char * szLogThis = (*env)->GetStringUTFChars(env, logThis, &isCopy);
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szLogThis);
(*env)->ReleaseStringUTFChars(env, logThis, szLogThis);
}
Am I not including an android library in my path possibly? I've only added the android r7b folder to my path so i could find ndk-build?
Thanks,
Thomas
Please look at this links.it may be helpfull..
http://psrdotcom.blogspot.in/2011/12/android-ndk-jni-windows-xp7-with-3264.html#!http://psrdotcom.blogspot.com/2011/12/android-ndk-jni-windows-xp7-with-3264.html
http://marakana.com/forums/android/examples/49.html
http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/
You need to downgrade to NDK 6b as shown here:
https://ar.qualcomm.at/arforums/showthread.php?t=1590
Vaclav
Related
I'm trying to link a Shared Library that I generated with the NDK-Standalone toolchain on a different build machine. Then using that specific .so I put it on Android Studio. From there I created a jni.h file using javah which then helped me write the .c JNI for the function calls.
Followed this example How do I compile any native (C, C++) library using NDK in the form of shared libraries .
ndk-build does compile and seems to work correctly but when trying to run the application on the phone I get a error at
static {
System.loadLibrary("testLib")
}
Saying that could not find testLib.so even though it is generated and in the libs/armeabi-v7a/testLib.so directory
CURRENT ERROR:
01-31 14:41:53.779 19024-19024/com.jolopy.testing_02 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jolopy.testing_02, PID: 19024
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.jolopy.testing_02-2/base.apk"],nativeLibraryDirectories=[/data/app/com.jolopy.testing_02-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "testLib.so"
at java.lang.Runtime.loadLibrary(Runtime.java:367)
at java.lang.System.loadLibrary(System.java:1076)
at com.jolopy.testing_02.TestLib.<clinit>(TestLib.java:6)
at com.jolopy.testing_02.MainActivity.onCreate(MainActivity.java:18)
How I built the .so file:
arm-linux-androideabi-gcc -c -fPIC testLib.c -o test.o
arm-linux-androideabi-gcc test.o -o testing.so
From there I wrote a JNI wrapper class using javah which generated the testing_Android.h file. Which from there generated the testing_Android.c JNI wrapper that I'm using to call functions from my testLib.c library:
#include "testLib.h"
//Including Machine Generated Header
#include "testing_Android.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_jolopy_testing_102_TestLib_testinglib_1Initialize
(JNIEnv *env, jobject obj){
(void)env;
(void)obj;
testing_Initialize();
}
JNIEXPORT jint JNICALL Java_com_jolopy_testing_102_TestLib_testinglib_1Get_1Count
(JNIEnv *env, jobject obj){
(void)env;
(void)obj;
return(testing_Get_Count());
}
JNIEXPORT jint JNICALL Java_com_jolopy_testing_102_TestLib_testinglib_1Get_1CurrentName
(JNIEnv *env, jobject obj, jlong ptr, jint x){
(void)env;
(void)obj;
return (testing_Get_CurrentName((char *)ptr , (int)x));
}
From there I have 5 files in the jni folder in Android which is where I run the ndk-build command from:
testing.so | testing_Android.h | testing_Android.c | Application.mk | Android.mk
Android.mk:
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testLib
LOCAL_SRC_FILES := testing.so
LOCAL_EXPORT_C_INCLUDES := testing_Android.c
include $(PREBUILT_SHARED_LIBRARY)
Application.mk:
APP_PLATFORM := android-19
APP_ABI := armeabi-v7a
Any suggestions or faults in my progress that you might see that I don't would be greatly appreciated.
-Cheers!
Change below
APP_ABI := armeabi-v7a
to
APP_ABI := arm64-v8a
Because from your error logs, your device is arm64 ABI.
If you are starting a new Android NDK project, I would like to suggest you start from Android Studio + CMake tool chains, see here for my personal JniExample project based on Android Studio and CMake:
https://github.com/russell-shizhen/JniExample
https://stackoverflow.com/a/52951886/8034839
Instead of using the ndk standalone toolchain, I used the ndk-build on my build machine which then generated the libs file I needed. From there I added the libs file with the contents of:
arm64-v8a
armeabi-v7a
x86
x86_64
Into my Android directory under src>main>jniLibs which then stored all the files and just added the command to my app build.gradle:
sourceSets.main{
jniLibs.srcDir 'src/main/jniLibs'
}
For ndk-build to work properly I had to include the jniWrapper.c file.
Android.mk:
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testing
LOCAL_SRC_FILES := jniWrapper.c \
testLib.c
include $(BUILD_SHARED_LIBRARY)
Application.mk (I was testing with "all" but its unneeded):
APP_PLATFORM := android-23
APP_ABI := all
I know this is a work around solution but for some reason I could not figure out the toolchain to work correctly.
I'm trying to modify this tutorial to include a prebuilt C library in my Android Studio project (ie. not using the experimental Gradle plugin) http://kvurd.com/blog/compiling-a-cpp-library-for-android-with-android-studio/
The library itself is coming from a client who won't reveal the source code, therefore I have no control over that part of the build process, however they are already following the same tutorial.
The project builds, load-library works and the NDK link (/jni/my-wrapper.c) works fine, until I try to call the actual library function defined in my prebuild header. The error I'm receiving is:
$ ndk-build
[arm64-v8a] Compile : my-wrapper <= my-wrapper.c
[arm64-v8a] SharedLibrary : libmy-wrapper.so
/Users/me/AndroidStudioProjects/MyProject/app/obj/local/arm64-v8a/objs/my-wrapper/my-wrapper.o: In function `Java_com_my_project_SignInActivity_CallFunction':
/Users/me/AndroidStudioProjects/MyProject/app/jni/my-wrapper.c:44: undefined reference to `MyFunction'
collect2: error: ld returned 1 exit status
make: *** [/Users/me/AndroidStudioProjects/MyProject/app/obj/local/arm64-v8a/libmy-wrapper.so] Error 1
Here's my Android.mk:
LOCAL_PATH := $(call my-dir)
# static library info
include $(CLEAR_VARS)
LOCAL_MODULE := libMyLib
LOCAL_MODULE_FILENAME := libMyLib
LOCAL_SRC_FILES := ../prebuild/libMyLib.a
LOCAL_EXPORT_C_INCLUDES := ../prebuild/include
include $(PREBUILT_STATIC_LIBRARY)
# wrapper info
include $(CLEAR_VARS)
LOCAL_C_INCLUDES += ../prebuild/include
LOCAL_MODULE := my-wrapper
LOCAL_SRC_FILES := my-wrapper.c
LOCAL_STATIC_LIBRARIES := libMyLib
include $(BUILD_SHARED_LIBRARY)
And MyLib.h (note that foobar() works fine as it's in the header but as long as I'm calling MyFunction from within my-wrapper.c the ndk-build fails):
#include <math.h>
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int MyFunction(some stuff);
int foobar(){return 1;};
Finally, my-wrapper.c:
#include <MyLib.h>
jbyte Java_com_my_project_SignInActivity_MyFunction(JNIEnv *env, jobject thiz, some other stuff){
// return MyFunction(some other stuff which I cast to C types); //linker fails if uncommented
return foobar(); //works fine
}
That's a C++ mangled name. You can only use it from C++, not from C.
If you really need to call it from C, you might be able to do it like so:
extern int _Z12MyFunctionP9my_structPhS1_S1_(/* whatever the function args are */);
jbyte Java_com_my_project_SignInActivity_MyFunction(
JNIEnv *env, jobject thiz, some other stuff) {
return _Z12MyFunctionP9my_structPhS1_S1_(args);
}
That depends on the code you're calling being compatible as such (if that's the case, you should ask the client to build their APIs as extern "C").
I'd really recommend just moving your code to C++ though.
I'd started porting some Java code in native c++ in Android. I have an issue with using strings in c++:
Type 'std::string' could not be resolved
There is my sample code
#include <jni.h>
#include <lexu_me_test_native.h>
#include <string.h>
using namespace std;
JNIEXPORT jstring JNICALL Java_lexu_me_test_native_prepairToShowNative
(JNIEnv * env, jclass javaThis, jstring str)
{
jboolean blnIsCopy;
jstring jstrOutput;
char* strCOut;
std::string ss;
const char* strCIn = (env)->GetStringUTFChars(str , &blnIsCopy);
// convert jstring to a char array
// Do stuff with the char array and and store the result
// in another char array strCOut
(env)->ReleaseStringUTFChars(str , strCIn); // release jstring
jstrOutput = (env)->NewStringUTF(strCOut); // convert char array to jstring
return jstrOutput;
}
Android.mk file:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := native
LOCAL_SRC_FILES := native.cpp
include $(BUILD_SHARED_LIBRARY)
Application.mk file:
APP_STL := stlport_static
MinGW installed and added to path. I tried using android-ndk-r8e and android-ndk-r8-crystax-1 nothing helped. In Cygwin Terminal errors:
Compile++ thumb : native <= native.cpp
jni/native.cpp: In function '_jstring* Java_lexu_me_test_native_prepairToShowNative(JNIEnv*, jclass, jstring)':
jni/native.cpp:11:2: error: 'string' was not declared in this scope
jni/native.cpp:11:9: error: expected ';' before 'ss'
I'm using Win 7 64bit. Can anyone say how it could be solved?
Thanks.
EDIT.
In C/C++ General - Path and Symbols already set: C:\Android\android-ndk-r8e\platforms\android-14\arch-arm\usr\include
If the other answers didn't work, then try these steps:
If you have using namespace std;, use string instead of std::string.
If #include <string> doesn't work and you're using Linux, try #include <unistd.h>. If you're using another OS, use #include <cstdlib>.
Check your Android.mk and Application.mk files. Ensure you select an STL library and include int the Application.mk file:
Application.mk: APP_STL := gnustl_static
(gnustl_static) can be replaced with the STL version you want, and STLPort is still an option
See http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html
I have a android program that has main logic written in NDK. But now I want to evaluate some python codes as part of main logic. So I tried to use this embed python in c http://docs.python.org/2/extending/embedding.html
I created a simple android project, with native.c like this (all I did was just adding python header)
#include <Python.h>
#include <jni.h>
#include <string.h>
#include <android/log.h>
#include <pthread.h>
#define DEBUG_TAG "NDK_AndroidNDK1SampleActivity"
void Java_com_example_com_test_mytest_MainActivity_helloLog(JNIEnv * env, jobject this, jstring logThis)
{
jboolean isCopy;
const char * szLogThis = (*env)->GetStringUTFChars(env, logThis, &isCopy);
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szLogThis);
(*env)->ReleaseStringUTFChars(env, logThis, szLogThis);
}
Here is my Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog `python2.7-config --ldflags`
LOCAL_MODULE := ndk1
LOCAL_SRC_FILES := native.c
LOCAL_CFLAGS := `python2.7-config --cflags`
#LOCAL_SHARED_LIBRARIES := -lpthread
include $(BUILD_SHARED_LIBRARY)
I got following error when compiling (using Mac)
Compile thumb : ndk1 <= native.c
arm-linux-androideabi-gcc: error: i386: No such file or directory
arm-linux-androideabi-gcc: error: x86_64: No such file or directory
arm-linux-androideabi-gcc: error: unrecognized option '-arch'
arm-linux-androideabi-gcc: error: unrecognized option '-arch'
make: *** [obj/local/armeabi/objs/ndk1/native.o] Error 1
Anyone could help please? :D
Python2.7-config was built for a 64 bit i386 system not for Android. It's passing bad arguments to the compiler in the LOCAL_CFLAGS field. Either run one that you built to cross compile on Android or specify the values yourself. Check google for 'Python-For-Android' (Py4A) on how to embed python in an NDK app.
I compiled simple file main.cpp using android-ndk-r8b:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
puts("!!!Hello World!!!");
return EXIT_SUCCESS;
}
I used command as follow:
.../android-ndk-r8b/ndk-build APP_ABI=x86
from the directory of main.cpp file
My Android.mk file:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS += -fPIC
LOCAL_MODULE := main
LOCAL_SRC_FILES := main.cpp
include $(BUILD_EXECUTABLE)
Then I tried to open this file on debian x86 and I have this information:
./main: No such file or directory
then I used command:
ld main
and had information:
ld: error in main(.eh_frame); no .eh_frame_hdr table will be created.
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048320
Is it possible to run file compiled via android-ndk on a common linux x86 distribution?
No, the Android run-time libraries are not compatible with desktop Linux.
Note that your ndk-build puts the main executable in ./libs/x86/