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

您可以使用 javah 生成方法签名(以头文件的形式),其中还包括在某些情况下可能需要的其他属性(如 JNIEXPORTJNICALL).

在此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);
}