JNI函数中的两个整数和返回错误的值
Sum two integers in JNI function return a wrong value
我正在调用一个本地函数,做一个非常简单的求和操作,但它返回一个错误的结果为什么?
下面是我的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
)。
在这个博客的帮助下我可以通过使用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);
}
相关文章:
- 让bool方法返回其他整数
- C 字符串返回字符串的整数/双精度/长整型值
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- C++:为什么我的掷骰子函数在掷骰子数量时只返回偶数整数?
- 从 C++ 中定义的异常返回整数
- 递归返回可被给定整数 k 整除的位数
- 类型转换问题:返回为整数而不是浮点/类型
- GMP-将64位整数存储在mpz_t/mpz_class中,并返回64位整数
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 无法将答案从矢量返回到整数
- 如何使用递归函数返回数组中整数的索引?
- 如何修改此函数,以便如果函数的参数是特定结构,则返回具有较大整数的结构?
- 对于 ((无符号整数)0-1)返回 true>0
- C++ - 整数除以整数返回错误答案
- 整数返回值的按位算术
- C++ 一种方法,该方法将十进制值作为用布尔数组表示的二进制的整数返回
- C++ 如何使模板<T>f() 为整数 T 返回 -1,为指针类型返回 nullptr
- 将函数的整数返回值与 C++ 中的布尔值进行比较