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

时间:2015-08-12 09:53:49

标签: android c++ android-ndk java-native-interface

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

这是我的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

2 个答案:

答案 0 :(得分:4)

本机函数中的两个第一个参数应为JNIEnv* env, jobject thiz(或静态方法为JNIEnv* env, jclass clazz)。您的代码当前实际执行的操作是,它会添加envthiz指针的值,而不是您要传递的实际参数。

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

答案 1 :(得分:1)

在此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 lib看起来像:

#include "nativeLib.h"

JNIEXPORT jint JNICALL Java_com_example_sharedlibexample_MainActivity_addInJNI
  (JNIEnv * env, jobject obj, jint value1, jint value2) {
        return (value1 + value2);
}