找不到本机的实现

时间:2014-09-16 01:18:27

标签: java android c eclipse java-native-interface

我用'ndk-build'编译了我的项目并生成了.so文件。当运行运行应用程序时,它会给出错误“找不到本机的实现”。

当我在调试模式下运行时,它会中断调用本机函数的位置,eclipes会显示此屏幕 - image

我已经检查了这个 - link和其他一些,我所有的jni函数名都是同步的..但不知道我哪里出错了。请帮忙

更新添加一些代码片段

MainActivity.java

package com.example.myproject2;


import java.io.InputStream;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

   import java.io.BufferedInputStream;
   import java.io.File;
   import java.io.FileInputStream;
   import java.io.FileNotFoundException;
   import java.io.FilenameFilter;
   import java.io.IOException;
   import java.nio.ByteBuffer;
   import java.nio.ByteOrder;
   import java.util.ArrayList;
   import java.util.HashMap;





public class MainActivity2 extends Activity {



static int bytesize=0;

//public class fRead{






     public native int getMyData(short[] shorts,int size);

     static {
            System.loadLibrary("mylib");
            }

    ..
..
}

mytest.c代码

#include "com_example_myproject2_MainActivity.h"


JNIEXPORT jint JAVA_com_example_myproject2_MainActivity2_getMyData(jshortArray shorts,jint byteArrsize){



int a=0;
int i=0;
int avg=0;


return avg;

}

2 个答案:

答案 0 :(得分:1)

更改getMyData

的定义
jint JAVA_com_example_myproject1_MainActivity_getMyData(jshortArray shorts,jint byteArrsize){

JNIEXPORT jint JNICALL Java_com_example_myproject1_MainActivity_getMyData(JNIEnv *env, jobject obj, jshortArray array, jint size)

<强> MainActivity.java

package com.example.myproject1;
/* All imports */ 

public class MainActivity extends Activity {

    static {
        System.loadLibrary("mylib");
    }

    /* Native Function Declaration */
    public static native int getMyData(short[] shorts, int size);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getMyData(array, size);    /* Native Function call */
    }
}

<强>的main.c

#include <stdio.h>
#include <android/log.h>
#include <jni.h>

#define TAG "HelloJNI"

JNIEXPORT jint JNICALL Java_com_example_myproject1_MainActivity_getMyData(JNIEnv *env, jobject obj, jshortArray array, jint size)
{
    __android_log_print(ANDROID_LOG_DEBUG, TAG, "JNI Function Called : getMyData");
    return size;
}

<强>输出
应用程序启动时。

$ adb logcat -s HelloJNI
D/HelloJNI(  672): JNI Function Called : getMyData

注意:
请注意,避免在包名称,活动名称或JNI函数名称中加下下划线(_)。

答案 1 :(得分:0)

我发现我的代码出了什么问题。这个问题与其他链接中的答案不同,所以我在这里发帖...这样可以帮助其他人。

问题在于我的原生功能。

而不是将函数称为 -

JNIEXPORT jint JAVA_com_example_myproject2_MainActivity2_getMyData(jshortArray shorts,jint{
...
...
}

我应该称之为 -

JNIEXPORT jint JAVA_com_example_myproject2_MainActivity2_getMyData(JNIEnv* pEnv, jobject 
pThis,jshortArray shorts ,jint byteArrsize){
...
...
}

即使我没有使用 JNIEnv * pEnv jobject pThis ,我也必须在原生端函数中编写它们。