我正在研究Android Studio中的JNI示例,其目的是生成随机值并将其传递给本机函数,该函数将计算其Square并以此格式(Number / Square)返回结果。
我将jint数作为函数的参数传递,但结果完全错误(显示的结果完全错误)。 这是我的代码:
按钮生成数字并调用本机函数:
Button ButtonP = (Button)findViewById(R.id.button3);
ButtonP .setOnClickListener(
new View.OnClickListener()
{
public void onClick(View view)
{
Random r = new Random();
Integer valeur = 1 + r.nextInt(10 - 1);
Log.i("Tag", "Random Value BARRAK " + valeur);
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNIStop(valeur));
}
});
原生功能:
public native String stringFromJNIStop(Integer nombre);
cpp文件中函数的实现:
extern "C"
JNIEXPORT jstring JNICALL
Java_fr_utbm_testjniapplication1_MainActivity_stringFromJNIStop(
JNIEnv *env,
jobject, /* this */
jint nombre) {
jint CarreNombre = nombre*nombre;
//Convertir le carré en un jstring
char bufCarreNombre[64];
sprintf(bufCarreNombre, "%d", CarreNombre); // error checking omitted
jstring jStringCarre = (*env).NewStringUTF(bufCarreNombre);
//Le convertir en un char *
const char *strCarre= (*env).GetStringUTFChars(jStringCarre,0);
//Convertir le nombre en un jstring
char bufNombre[64];
sprintf(bufNombre, "%d", nombre); // error checking omitted
jstring jStringNombre = (*env).NewStringUTF(bufNombre);
//Le convertir en char *
const char *strNombre= (*env).GetStringUTFChars(jStringNombre,0);
//Concaténer les deux
char *concatenated;
concatenated = (char *) malloc(strlen(strNombre) + strlen("/") + strlen(strCarre) + 1);
strcpy(concatenated, strNombre);
strcat(concatenated, "/");
strcat(concatenated, strCarre);
/* Create java string from our concatenated C string */
jstring retval = (*env).NewStringUTF(concatenated);
//need to release this string when done with it in order to
//avoid memory leak
(*env).ReleaseStringUTFChars(jStringNombre,strNombre);
(*env).ReleaseStringUTFChars(jStringCarre,strCarre);
/* Free the memory in concatenated */
free(concatenated);
return retval;
}
答案 0 :(得分:2)
原生功能:
public native String stringFromJNIStop(Integer nombre);
cpp文件中函数的实现:
extern "C"
JNIEXPORT jstring JNICALL
Java_fr_utbm_testjniapplication1_MainActivity_stringFromJNIStop(
JNIEnv *env,
jobject, /* this */
jint nombre) {
这与您的Java不一致。您已经在Java中将其从int
更改为Integer
而未重新生成.h文件,或者您已经更改或发明了.h文件而未引用.java文件;或.cpp文件与.h / .hpp文件不一致。不要这样做。使用javah
生成.h / .hpp文件,并在每次更改.java文件中的本机声明时重做它,并确保.cpp文件与.h / .hpp一致文件。它应该是:
extern "C"
JNIEXPORT jstring JNICALL
Java_fr_utbm_testjniapplication1_MainActivity_stringFromJNIStop(
JNIEnv *env,
jobject, /* this */
jobject nombre) {
其中nombre
指的是Integer
。但是,将Java本机方法定义为:
public native String stringFromJNIStop(int nombre);
现在将同意您现有的.cpp。
你的.cpp也应该#include
你的.h / .hpp。那么你就不需要extern "C"
或JNI_EXPORT
或JNI_CALL
,并且编译器可能已经检测到.cpp和.h / .hpp之间的签名不一致。
答案 1 :(得分:-2)
在一些反思之后,问题得到了解决,事实上,为了使用jint实现JNI函数,我们必须在JAVA部分中采用精确的转换规则,因此我们必须将随机值声明为整数,宣称它很长!所以我们必须按照以下方式工作:
long valeur = 1 + r.nextInt(10 - 1);