将 JNI 函数中的两个整数求和 return 一个错误的值
Sum two integers in JNI function return a wrong value
我正在调用一个执行非常简单的求和运算的本机函数,但它 returns 结果是错误的,为什么?!
这是我的 java 代码:
package com.example.sharedlibexample;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.text);
tv.setText("Value = " + String.valueOf(addInJNI(15, 8)));
}
public native int addInJNI(int a, int b);
static {
System.loadLibrary("hello-jni");
}
}
这是本机代码:
int Java_com_example_sharedlibexample_MainActivity_addInJNI(int a, int b) {
return a + b;
}
这个求和例子的结果是:
-921636135
本机函数中的前两个参数应为 JNIEnv* env, jobject thiz
(或静态方法为 JNIEnv* env, jclass clazz
)。您的代码当前实际做的是,它添加了 env
和 thiz
指针的值,而不是您打算传递的实际参数。
您可以使用 javah
生成方法签名(以头文件的形式),其中还包括在某些情况下可能需要的其他属性(如 JNIEXPORT
、JNICALL
).
在此blog的帮助下
我可以使用 jint
而不是 int
找到解决方案
解决方法是:
创建头文件bativeLib.h
#include <jni.h>
/* Header for class com_marakana_NativeLib */
#ifndef _Included_org_example_ndk_nativeLib
#define _Included_org_example_ndk_nativeLib
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_marakana_NativeLib
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_sharedlibexample_MainActivity_addInJNI
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
C 库看起来像:
#include "nativeLib.h"
JNIEXPORT jint JNICALL Java_com_example_sharedlibexample_MainActivity_addInJNI
(JNIEnv * env, jobject obj, jint value1, jint value2) {
return (value1 + value2);
}
我正在调用一个执行非常简单的求和运算的本机函数,但它 returns 结果是错误的,为什么?!
这是我的 java 代码:
package com.example.sharedlibexample;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.text);
tv.setText("Value = " + String.valueOf(addInJNI(15, 8)));
}
public native int addInJNI(int a, int b);
static {
System.loadLibrary("hello-jni");
}
}
这是本机代码:
int Java_com_example_sharedlibexample_MainActivity_addInJNI(int a, int b) {
return a + b;
}
这个求和例子的结果是:
-921636135
本机函数中的前两个参数应为 JNIEnv* env, jobject thiz
(或静态方法为 JNIEnv* env, jclass clazz
)。您的代码当前实际做的是,它添加了 env
和 thiz
指针的值,而不是您打算传递的实际参数。
您可以使用 javah
生成方法签名(以头文件的形式),其中还包括在某些情况下可能需要的其他属性(如 JNIEXPORT
、JNICALL
).
在此blog的帮助下
我可以使用 jint
而不是 int
解决方法是:
创建头文件bativeLib.h
#include <jni.h>
/* Header for class com_marakana_NativeLib */
#ifndef _Included_org_example_ndk_nativeLib
#define _Included_org_example_ndk_nativeLib
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_marakana_NativeLib
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_sharedlibexample_MainActivity_addInJNI
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
C 库看起来像:
#include "nativeLib.h"
JNIEXPORT jint JNICALL Java_com_example_sharedlibexample_MainActivity_addInJNI
(JNIEnv * env, jobject obj, jint value1, jint value2) {
return (value1 + value2);
}