gpt4 book ai didi

java.lang.UnsatisfiedLinkError : Native method not found: Error in jni() 错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:05 24 4
gpt4 key购买 nike

我正在尝试通过将 jni 与 android Activity 一起使用来添加两个二维数组。在 android 主 Activity 类中,我创建了一个类 sample.java 的对象。并将示例类实例的字段传递给native代码进行添加。sample.java如下

    package com.cdacb.mars.ntvoperation;

public class Sample {

public int[][] array1;
public int[][] array2;
public int[][] array3;
}

native 代码的定义是:

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文件是

    LOCAL_PATH := $(call my_dir)

include $(CLEAR_VARS)

LOCAL_MODULE := Ntvoperation
LOCAL_SRC_FILE := operation.c

include $(BUILD_SHARED_LIBRARY)

但是当我运行 thie=s 模块时,它会在 logcat 中生成错误:

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)

请帮我解决这个问题。

我的主要java类是

        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");
}

}

最佳答案

这个问题可能与C++函数名修饰有关;如果你用 extern "C"{...} 包围你的 C++ 函数,那么你应该能够避免这种麻烦,JNI 应该会找到你的本地方法。在阅读 this 之前,我遇到了同样的问题线程描述了一个类似的问题,但已验证 ANSI C native 函数有效,但 C++ 抛出 native 方法未找到错误。希望这会有所帮助,并支持在链接线程上提供此建议的@yellowstonely

关于java.lang.UnsatisfiedLinkError : Native method not found: Error in jni() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13248288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com