Java.lang.UnsatisfiedLinkError: native method not found: error in jni ()

I am trying to make adding two 2D arrays using jni with android activity. in the android main activity class, I create an object of the sample.java class. And pass the instance class instance field into your own code to add. sample.java as follows

package com.cdacb.mars.ntvoperation; public class Sample { public int[][] array1; public int[][] array2; public int[][] array3; } 

definition for native code:

 JNIEXPORT void JNICALL Java_com_cdacb_mars_ntvoperation_Operation_int2dAddition (JNIEnv *env,jobject this,jobject object ){ jclass class = (*env)->GetObjectClass(env,object); if(class==Null){ printf("Error in finding class"); return 0; } jfieldID fid1= (*env)->GetFieldID(env , class ,"array1","[[I"); if(fid1==Null){ printf("Error in finding mat1 field "); return 0; } jfieldID fid2= (*env)->GetFieldID(env , class ,"array2","[[I"); if(fid2==Null){ printf("Error in finding mat2 field "); return 0; } jfieldID fid3= (*env)->GetFieldID(env , class ,"array3","[[I"); if(fid3==Null){ printf("Error in finding mat3 field "); return 0; } jobjectArray arr1= (jobjectArray)(*env)->GetObjectField(env,this,fid1); jobjectArray arr2= (jobjectArray)(*env)->GetObjectField(env,this,fid2); jobjectArray class= (*env)->NewObjectArray(env,length,Class,NULL); for(jint i=0; i<16; i++){ class[i]=arr1[i]+arr2[i]; } (*env)->SetObjectField(env, this, fid3, class); } 

Android.mk file

  LOCAL_PATH := $(call my_dir) include $(CLEAR_VARS) LOCAL_MODULE := Ntvoperation LOCAL_SRC_FILE := operation.c include $(BUILD_SHARED_LIBRARY) 

But when I run the thie = s module, it generates an error in logcat like:

 11-06 14:46:35.875: D/dalvikvm(936): Trying to load lib /data/data/com.cdacb.mars.ntvoperation/lib/libNtvoperation.so 0x411e7090 11-06 14:46:35.905: W/dalvikvm(936): No implementation found for native Lcom/cdacb/mars/ntvoperation/Operation;.int2dAddition:(Lcom/cdacb/mars/ntvoperation/Sample;)V 11-06 14:46:35.924: E/AndroidRuntime(936): java.lang.UnsatisfiedLinkError: Native method not found: com.cdacb.mars.ntvoperation.Operation.int2dAddition:(Lcom/cdacb/mars/ntvoperation/Sample;)V 11-06 14:46:35.924: E/AndroidRuntime(936): at com.cdacb.mars.ntvoperation.Operation.int2dAddition(Native Method) 11-06 14:46:35.924: E/AndroidRuntime(936): at com.cdacb.mars.ntvoperation.Operation.onCreate(Operation.java:36) 11-06 14:46:35.924: E/AndroidRuntime(936): at android.app.Activity.performCreate(Activity.java:5008) 11-06 14:46:35.924: E/AndroidRuntime(936): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 11-06 14:46:35.924: E/AndroidRuntime(936): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 11-06 14:46:35.924: E/AndroidRuntime(936): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 11-06 14:46:35.924: E/AndroidRuntime(936): at android.app.ActivityThread.access$600(ActivityThread.java:130) 11-06 14:46:35.924: E/AndroidRuntime(936): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 11-06 14:46:35.924: E/AndroidRuntime(936): at android.os.Handler.dispatchMessage(Handler.java:99) 11-06 14:46:35.924: E/AndroidRuntime(936): at android.os.Looper.loop(Looper.java:137) 11-06 14:46:35.924: E/AndroidRuntime(936): at android.app.ActivityThread.main(ActivityThread.java:4745) 11-06 14:46:35.924: E/AndroidRuntime(936): at java.lang.reflect.Method.invokeNative(Native Method) 11-06 14:46:35.924: E/AndroidRuntime(936): at java.lang.reflect.Method.invoke(Method.java:511) 11-06 14:46:35.924: E/AndroidRuntime(936): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 11-06 14:46:35.924: E/AndroidRuntime(936): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 11-06 14:46:35.924: E/AndroidRuntime(936): at dalvik.system.NativeStart.main(Native Method) 

please help me solve this problem.

my main java class

  package com.cdacb.mars.ntvoperation; import android.R.string; import android.os.Bundle; import android.app.Activity; import android.widget.TextView; public class Operation extends Activity { private native void int2dAddition(Sample object); String display=" "; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.main); TextView screen = new TextView(this); Sample tc=new Sample(); tc.array1=new int[4][4]; tc.array2=new int[4][4]; tc.array3=new int[4][4]; for(int col=0;col<4;col++){ for(int row=0;row<4;row++){ tc.array1[col][row]=2; tc.array2[col][row]=4; tc.array3[col][row]=0; } } int2dAddition(tc); for(int col=0;col<4;col++){ for(int row=0;row<4;row++){ display= display + tc.array3[col][row] +","; } } screen.setText(display); setContentView(screen); } static{ System.loadLibrary("Ntvoperation"); } } 
+4
source share
1 answer

This problem may be related to decorating the name of a C ++ function; if you surround your C ++ functions with extern "C" {...}, you should be able to avoid these problems, and JNI should find your own methods. I had the same problem until I read this thread describing a similar problem, but where it was verified that the ANSI C native functions worked, but C ++ launched its own method that did not detect an error. Hope this helps, and the @yellowstonely props who provided this suggestion on a related topic

+5
source

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


All Articles