Android NDK C++ JNI (no implementation found for native...)
There are a couple of things that can lead to "no implementation found". One is getting the function prototype name wrong, another is failing to load the .so at all. Are you sure that System.loadLibrary()
is being called before the method is used?
If you don't have a JNI_OnLoad
function defined, you may want to create one and have it spit out a log message just to verify that the lib is getting pulled in successfully.
You already dodged the most common problem -- forgetting to use extern "C"
-- so it's either the above or some slight misspelling. What does the Java declaration look like?
No implementation found for native code in android
I guess you are using a clang++ compiling c source code, right? If true, try to change your file name to be armArch.cpp and add keyword extern into your C header and source files. e.g.
#ifdef __cplusplus
extern "C" {
#endif
// your function declarations or implementations.
#ifdef __cplusplus
}
#endif
Also, i would like to suggest use externalNativeBuild and cmake block rather than the older ndk block which is not the modern convention for Android native builds. E.g.
android {
//....
defaultConfig {
applicationId "com.softcode.kihnoplay"
minSdkVersion 21
targetSdkVersion 25
versionCode 1
versionName "1.00"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
}
buildTypes {
release {
//....
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
Android NDK has deprecated armeabi, you don't actually need to include this ABI is your abiFilters setting. ABIs 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' will be enough for supporting almost all the current Android devices as well as emulators.
You can find a comprehensive JNI tutorial from https://arophix.com/2017/12/17/andoid-jni-summary/
and a sample JNI project from https://github.com/russell-shizhen/JniExample
android ndk jni No implementation found error
Since your native file is a .cpp file, I am guessing that you will need to use extern "C". Why and Why
No implementation found for int com.example.nimashahbazi.mooshak.EncryptingActivity.encrypt
I'm writing this for further similar issues as the accepted answer as Alex has explained in the comments. I had to add "extern C" to the definition of functions in native-lib:
extern "C"
{
JNIEXPORT jint JNICALL
Java_com_example_nimashahbazi_mooshak_EncryptingActivity_encrypt(JNIEnv *env, jobject obj,
jstring encryptionKey,
jstring inputFile,
jstring outputFile);
JNIEXPORT jint JNICALL
Java_com_example_nimashahbazi_mooshak_DecryptingActivity_decrypt(JNIEnv *env, jobject obj,
jstring encryptionKey,
jstring inputFile,
jstring outputFile);
}
Android Studio Native CMake No implementation found for native
Apparently that error that wasn't in the tutorial (which went by adding SET_TARGET_PROPERTIES
) was the key.
I've found out the problem. In my CMakeLists.txt
I was referencing the folder src/main/cpp/src
. It wasn't really compiling any files. I've checked with nm
(ARM version) and I've seen no actual method inside the .so
file. Then, I've added some garbage into my CPP file (which shouldn't compile) but the build completed successfully. My initial assumption about CPP file being compiled was incorrect: the toolchain wasn't even trying to compile my file. It seems that I need to list files to compile explicitly:
add_library( # Specifies the name of the library.
myappNative
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/src/com_myapp_system_Native.cpp
src/main/cpp/src/sha256.c
)
I have no idea how to include a folder. I've tried src/main/cpp/src
, src/main/cpp/src/*
, src/main/cpp/src/*.cpp
but none of them seem to work. After changing the file, my app started to run (and load the native component) correctly.
No implementation found for using NativeActivity
Ok well I found the issue. Seems in this case since the System.loadlibrary is not used with the glue code then the standard lookup mechanism does not work. You have to call RegisterNatives manually (from a valid JNIEnv). So for this case you need to do the following:
void nativeJniCall(JNIEnv *, jclass)
{
LOGV("nativeJniCall");
}
void android_main(struct android_app* state)
{
test_call(state->activity);
etc...
}
...
void test_call(ANativeActivity *activity)
{
JNIEnv *jni;
activity->vm->AttachCurrentThread(&jni, NULL);
jclass activityClass=jni->GetObjectClass(activity->clazz);
jmethodID testCallId=jni->GetMethodID(activityClass, "testCall", "()V");
JNINativeMethod methodTable[]=
{
{"nativeJniCall", "()V", (void *)nativeJniCall}
};
int methodTableSize=sizeof(methodTable)/sizeof(methodTable[0]);
jni->RegisterNatives(activityClass, methodTable, methodTableSize);
jni->CallVoidMethod(activity->clazz, testCallId);
}
For production you would cache all the jclass/jmethoidIDs (remember to use NewGlobalRef/DeleteGlobalRef) and only register the the native functions with the class once, but this serves as an example. Hope it saves someone else some time.
Related Topics
Android Fragment Onrestoreinstancestate
How to Iterate Through a View's Elements
Cursorloader Not Updating After Data Change
How to Use the Android Accelerometer
Calculate the Size of a List View or How to Tell It to Fully Expand
Eclipse Indigo - Cannot Install Android Adt Plugin
Android How to Create Triangle and Rectangle Shape Programmatically
Android: How to Get Gsm Signal Strength for All Available Network Operators
Importing Jar Libraries into Android-Studio
Android Open Camera from Button
Live Audio Recording and Playing in Android and Thread & Callback Handling
Error:(9, 5) Error: Resource Android:Attr/Dialogcornerradius Not Found
Failure [Install_Failed_Invalid_Apk]
Build Errors After Android Studio 3.2.1 Upgrade
How to Add Action Bar Options Menu in Android Fragments
Androidstudio - Module Dependencies in Gradle
Android Textview: Setting the Background Color Dynamically Doesn't Work