2013-07-14 50 views
0

我正在爲我的Android項目設立NDK。 我有輸出到模擬器 我有一個本地函數調用somefunc(),我到這個字符串,它拋出一個錯誤,指出一個TextView「產量」 的Android項目。的Android NDK和JNI本地方法沒有找到

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函數時存在拼寫錯誤或錯誤。我已閱讀,C函數應JAVA_ [封裝用下劃線代替點] [Java類] [函數名]被調用。我想我正在遵守這一點。我道歉我的第一個問題看起來像一個刻板的「解決這個問題」的問題。我只是想在那裏的代碼,所以它顯示了什麼樣的軟件包被稱爲和什麼樣的製造。 謝謝

+0

應該有大約庫加載企圖logcat的信息 - 你可以忽略關於jnionload警告,但你應該看到成功或失敗存在的指示。從技術上講,你的返回類型應該是jint而不是int,但實際上它們可能是一樣的。有時候,如果你真的陷入困境,從hello-jni樣本開始,根據需要進行變換,在兩次測試之間進行一次更改可以幫助您找出錯誤發生的位置。 –

+0

謝謝你的回覆,hello-jni完美的作品,我覺得我的項目設置一定有問題。我會重試製作一個新項目,看看它是否有效。 – user700508

+0

這似乎不是你的問題,但我已經與類似的問題打了幾個小時。我的問題是我的本地函數包含下劃線(例如'native int get_result()')。在jni命名(Java_mypackage_myclass_get_result ...)中一切正常,但JNI未檢測到'get_result'是該函數的名稱,所以我得到一個UnsatisfiedLinkerror。解決方法是從函數中刪除所有下劃線(例如,將get_result()轉換爲getResult())。 (我正在使用'javah -jni'創建頭文件,並且我沒有收到任何警告) 希望它可以幫助某人 – Miquel

回答

2

你可以通過調用

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

從源目錄中獲取本機的功能正確的原型。這將創建一個頭文件com_ndktest_MainActivity.h,它可以包含在C文件中。

(順便說一句:如果你的本地文件編譯爲C++,你需要extern "C" {...}

+2

當您的'System.loadLibrary'調用缺失或在一個沒有使用的類。 – Oren

0

你可以嘗試從

JNIEXPORT INT JNICALL

改變

JNIEXPORT jint JNICALL