我正在爲我的Android項目設立NDK。 我有輸出到模擬器 我有一個本地函數調用somefunc()
,我到這個字符串,它拋出一個錯誤,指出一個TextView「產量」 的Android項目。的Android NDK和JNI本地方法沒有找到
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函數時存在拼寫錯誤或錯誤。我已閱讀,C函數應JAVA_ [封裝用下劃線代替點] [Java類] [函數名]被調用。我想我正在遵守這一點。我道歉我的第一個問題看起來像一個刻板的「解決這個問題」的問題。我只是想在那裏的代碼,所以它顯示了什麼樣的軟件包被稱爲和什麼樣的製造。 謝謝
應該有大約庫加載企圖logcat的信息 - 你可以忽略關於jnionload警告,但你應該看到成功或失敗存在的指示。從技術上講,你的返回類型應該是jint而不是int,但實際上它們可能是一樣的。有時候,如果你真的陷入困境,從hello-jni樣本開始,根據需要進行變換,在兩次測試之間進行一次更改可以幫助您找出錯誤發生的位置。 –
謝謝你的回覆,hello-jni完美的作品,我覺得我的項目設置一定有問題。我會重試製作一個新項目,看看它是否有效。 – user700508
這似乎不是你的問題,但我已經與類似的問題打了幾個小時。我的問題是我的本地函數包含下劃線(例如'native int get_result()')。在jni命名(Java_mypackage_myclass_get_result ...)中一切正常,但JNI未檢測到'get_result'是該函數的名稱,所以我得到一個UnsatisfiedLinkerror。解決方法是從函數中刪除所有下劃線(例如,將get_result()轉換爲getResult())。 (我正在使用'javah -jni'創建頭文件,並且我沒有收到任何警告) 希望它可以幫助某人 – Miquel