我刚刚开始使用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
答案 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
。