JNI函数中的两个整数和返回错误的值

Sum two integers in JNI function return a wrong value

本文关键字:整数 返回 两个 错误 函数 JNI      更新时间:2023-10-16

我正在调用一个本地函数,做一个非常简单的求和操作,但它返回一个错误的结果为什么?

下面是我的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)。你的代码当前实际做的是,它添加了envthiz指针的值,而不是你打算传递的实际参数。

您可以使用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);
}