未找到Android NDK和JNI本机方法

时间:2013-07-14 14:57:47

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

我正在为我的android项目设置NDK。 我有一个带有textview的android项目,可以输出到模拟器 “产量” 我有一个名为somefunc()的本机函数,我添加到此字符串,它会引发错误说明。

E/AndroidRuntime(2242): java.lang.UnsatisfiedLinkError: Native method not found: com.ndktest.MainActivity.somefunc:()I

我认为需要三个文件 MainActivity.java test.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;
}

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILE := test.c
include $(BUILD_SHARED_LIBRARY)

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并加载库。我试过试试它并尝试通过系统加载库。所以我假设有一个拼写错误或错误我如何命名我的c函数。我已经读过应该在Java_ [带有下划线的包而不是点] [java class] [function name]中调用c函数。我想我会遵守这个。我道歉,问题的前半部分看起来像一个刻板的“为我解决这个问题”。我只是想要那里的代码,所以它显示了调用包的内容以及make的外观。 谢谢

2 个答案:

答案 0 :(得分:2)

您可以通过调用

获取原生函数的正确原型

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

来自您的源目录的

。这将创建一个标题com_ndktest_MainActivity.h,它可以包含在您的C文件中。

(顺便说一句:如果您的本机文件编译为C ++,则需要extern "C" {...}

答案 1 :(得分:0)

您可以尝试从

更改
  

JNIEXPORT int JNICALL

  

JNIEXPORT jint JNICALL