我正在调用一个执行非常简单的求和操作的本机函数,但它返回错误的结果为什么?!
这是我的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
答案 0 :(得分:4)
本机函数中的两个第一个参数应为JNIEnv* env, jobject thiz
(或静态方法为JNIEnv* env, jclass clazz
)。您的代码当前实际执行的操作是,它会添加env
和thiz
指针的值,而不是您要传递的实际参数。
您可以使用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);
}