未找到Android NDK和JNI本机方法

未找到Android NDK和JNI本机方法,android,c,android-ndk,java-native-interface,Android,C,Android Ndk,Java Native Interface,我正在为我的android项目设置NDK。 我有一个android项目,带有一个输出到模拟器的textview “输出=” 我将一个名为somefunc()的本机函数添加到此字符串中,它会抛出一个错误声明 E/AndroidRuntime(2242): java.lang.UnsatisfiedLinkError: Native method not found: com.ndktest.MainActivity.somefunc:()I 我有三个我认为需要的文件MainActivity.ja

我正在为我的android项目设置NDK。 我有一个android项目,带有一个输出到模拟器的textview “输出=” 我将一个名为
somefunc()
的本机函数添加到此字符串中,它会抛出一个错误声明

E/AndroidRuntime(2242): java.lang.UnsatisfiedLinkError: Native method not found: com.ndktest.MainActivity.somefunc:()I
我有三个我认为需要的文件MainActivity.javatest.c和Android.mk

test.c中我有

#include <string.h>
#include <jni.h>

JNIEXPORT int JNICALL
Java_com_ndktest_MainActivity_somefunc(JNIEnv * env, jobject  obj)
{
return 2;
}
MainActivity.java

package com.ndktest;

import com.ndktest.R;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {

static
{
  System.loadLibrary("test");
}
public native int somefunc();

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

    TextView tv = new TextView(getBaseContext());
    tv.setTextSize(30);
    String s = "Ouput="+somefunc();
    tv.setText(s);
    this.setContentView(tv);
}
}
我从网上的各种指南中了解到,拼写错误是导致这一错误的最常见原因。我已经尽力检查了包和c函数代码中的拼写错误,但到目前为止我没有看到它。我还能够在makefile上运行“ndk build”,它编译时不会出错。它生成libtest,我加载库。我已经尝试了一个关于它的try-catch,尝试通过了系统加载库。因此,我假设在命名c函数时存在拼写错误或错误。我已经读到,c函数应该在Java_u3;[用下划线代替圆点的包][Java类][函数名]中调用。我想我正在遵守这一点。我很抱歉,我的问题的前半部分看起来像一个刻板的“为我解决这个”问题。我只是想要那里的代码,以便它显示调用的包以及make的样子。
谢谢

您可以通过调用

javah-classpath bin/classes-d jni com.ndktest.MainActivity

从您的源目录。这将创建一个标题
com\u ndktest\u MainActivity.h
,它可以包含在您的C文件中


(BTW:如果您的原生文件被编译为C++,则需要<代码> Extn”C“{…} /代码>”

< P>可以尝试从

进行更改吗? JNIEXPORT int JNICALL

JNIEXPORT jint JNICALL


logcat中应该有关于库加载尝试的消息-您可以忽略关于jnionload的警告,但是您应该在那里看到成功或失败的指示。从技术上讲,您的返回类型应该是jint而不是int,但实际上它们可能是相同的。有时候,如果你真的陷入困境,从hello jni示例开始,在测试之间一次修改一次,将有助于找出错误所在。谢谢你的回复,hello jni工作得很好,我觉得我设置项目的方式一定有问题。我会尝试做一个新的项目,看看是否有效。这似乎不是你的问题,但我已经为一个类似的问题奋斗了好几个小时。我的问题是我的本机函数包含下划线(例如“native int get_result()”)。jni命名(Java_mypackage_myclass_get_result…)中的一切都正常,但jni没有检测到“get_result”是函数名,因此我得到了一个不满意的链接错误。解决方案是从函数中删除所有下划线(比如将get_result()转换为getResult()。(我正在使用“javah-jni”创建头文件,但没有收到任何警告)希望它对某些人有所帮助当“System.loadLibrary”调用丢失或在未使用的类中时,此问题也会发生。
package com.ndktest;

import com.ndktest.R;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {

static
{
  System.loadLibrary("test");
}
public native int somefunc();

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

    TextView tv = new TextView(getBaseContext());
    tv.setTextSize(30);
    String s = "Ouput="+somefunc();
    tv.setText(s);
    this.setContentView(tv);
}
}