将参数传递给JNI会给出错误java.lang.UnsatisfiedLinkError

时间:2014-07-21 10:48:31

标签: android android-ndk java-native-interface

我刚刚开始使用NDK并且我运行了Hello_Jni,我知道它是如何工作的但我想尝试做这样的事情并且无法让它工作(我手动做这个)

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都在我的Activity的JNI文件夹中。 并且在我的Activity的文件夹中运行Build-ndk显示没有错误

但是当我尝试在我的平板电脑上构建它时,我得到了这个错误。

java.lang.UnsatisfiedLinkError:round_decimals

3 个答案:

答案 0 :(得分:1)

您从.java版本中生成.h文件,其中包含一个package语句,然后您修改了.java文件以删除package语句,然后编译并运行,没有任何匹配。

这里还有其他问题。如果你正确生成了文件,方法签名应该是(JNIEnv *,jobject,jdouble,jint)。

重新生成.h文件并相应地调整.c文件。

答案 1 :(得分: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);

答案 2 :(得分:0)

您的方法名称中有下划线(_),下划线是JNI约定中的名称分隔符。

将java方法名称更改为camel case是一种解决方案,但您也可以使用本机方法名称中的_1来转义下划线,如下所示:Java_com_example_Test_round_1decimals