0

我正在为我的 android 项目设置 NDK。我有一个带有文本视图的 android 项目,该项目输出到模拟器“Output =”我有一个名为的本机函数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;
}

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 类]中调用 c 函数[函数名称]。我想我正在遵守这一点。我很抱歉,我的前半部分问题看起来像是一个刻板的“为我解决这个问题”的问题。我只是想要那里的代码,所以它显示了包的名称和 make 的样子。谢谢

4

2 回答 2

2

您可以通过调用获得本机函数的正确原型

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

从您的源目录。这将创建一个com_ndktest_MainActivity.h可以包含在 C 文件中的标头。

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

于 2013-07-14T21:06:02.737 回答
0

你可以尝试从

JNIEXPORT int JNICALL

JNIEXPORT jint JNICALL

于 2014-01-08T19:56:18.127 回答