我正在为我的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的外观。 谢谢
答案 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