2014-07-21 94 views
0

我剛開始使用NDK,我跑了Hello_Jni,我知道這是如何工作,但我想嘗試做這樣的事情,不能得到它的工作(我做這個手動)傳遞參數給JNI給出錯誤java.lang.UnsatisfiedLinkError

simple.c

#include "simple.h" 
#include <jni.h> 

JNIEXPORT jdouble JNICALL 
Java_com_example_Test_round_decimals (JNIEnv * env, jobject obj, jdouble value, jint decimals) { 
        double m = pow (10, decimals); 
    return (double) round (value * m)/m; 
} 

JNIEXPORT jstring JNICALL Java_com_example_Test_hello(JNIEnv* env, jobject javaThis) { 
    return (*env)->NewStringUTF(env, "Hello from ME!"); 
} 

simple.h

#include <stdio.h> 
#include <stdlib.h> 
#include "math.h" 
#include <string.h> 
#include <jni.h> 


JNIEXPORT jdouble JNICALL Java_com_example_Test_round_decimals (JNIEnv * env, jobject obj,jdouble value, jint decimals); 
JNIEXPORT jstring JNICALL Java_com_example_Test_hello(JNIEnv* env, jobject javaThis); 

活動

public class Test{ 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
double test = round_decimals(10.1234,2); 
double test2 = hello();  

     Log.i("Round","Number" + test); // i would like to get this 

     Log.i("String","hello? " + test2); // this works it shows "Hello From ME!" 

} 
public native double round_decimals(double value, int decimals); 
public native String hello(); 

     static { 
      System.loadLibrary("simple"); 
     } 

} 

Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := simple 
LOCAL_SRC_FILES := simple.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 


include $(BUILD_SHARED_LIBRARY) 

android.mk,simple.c和simple.h是在我的活動的JNI文件夾中。 而且還在我的活動文件夾中運行Build-ndk顯示沒有錯誤

但是,當我嘗試在平板電腦上構建它時,出現此錯誤。

java.lang.UnsatisfiedLinkError:round_decimals 
+0

包名是什麼? – Michael

+0

java.com.example但是,當我編輯它與簡單的字符串工作 – MePo

回答

0

我發現這是與Java_com_example_Test_round_decimals問題不得不將其重命名爲 Java_com_example_Test_roundDecimals,並與我不得不重新命名public native double round_decimals(double value, int decimals);public native double roundDecimals(double value, int decimals);

1

您產生從一個版本,它有一個包語句的.java的的.h文件,然後修改了.java文件刪除軟件包語句,那麼你編譯和運行,並沒有匹配向上。

這裏還有其他的錯誤。如果您已正確生成文件,方法簽名應該是(JNIEnv *,jobject,jdouble,jint)。

重新生成.h文件並相應地調整.c文件。

+0

我沒有生成它們我自己做,但現在我試圖添加'字符串你好();'(將編輯我的帖子)顯示你好從我!它的工作原理!但是這個雙重給了我錯誤。 – MePo

+0

生成它們。使用工具。自己動手,事情出錯了。像這樣的事情。沒有用。 – EJP

+0

但是,如果我需要導入用C語言編寫的代碼,並且它有很多行,那麼不應該通過「手」來完成,而不是生成?剛開始使用NDK時,這可能是一個愚蠢的問題,但這就是我這樣做的原因 – MePo

0

你有一個下劃線(_)你的方法名和下劃線內是JNI約定中的名稱分隔符。

將java方法名稱更改爲駱駝大小寫是一種解決方案,但您也可以在本機方法名稱中使用_1轉義下劃線,如下所示:Java_com_example_Test_round_1decimals