我用'ndk-build'编译了我的项目并生成了.so文件。当运行运行应用程序时,它会给出错误“找不到本机的实现”。
当我在调试模式下运行时,它会中断调用本机函数的位置,eclipes会显示此屏幕 -
我已经检查了这个 - 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;
}
答案 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 ,我也必须在原生端函数中编写它们。