【问题标题】:I have to access the variables declared in java program from my c program using JNI in eclipse我必须在eclipse中使用JNI从我的c程序访问java程序中声明的变量
【发布时间】:2015-02-02 05:29:50
【问题描述】:

这是我的java代码

package com.example.javacallinc;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
public class JNITest extends Activity {
static {
System.loadLibrary( "JNITest" );
}
private int i = 42;
public String s = "Written in Java";
public static double sd = 3.14;
//protected static String ss = "JNI - Java";
public native String modifyVariables();
@Override public void onCreate(Bundle b) {
super.onCreate(b);
TextView tv = new TextView(this);
String s = modifyVariables();
s += "After calling C code, variables are:\n";
s += "i = " + Integer.toString(i) + "\n";
s += "s = " + s + "\n";
s += "sd = " + sd + "\n";
//s += "ss = " + ss + "\n";
tv.setText(s);
setContentView(tv);
}
}

这是我的 c 代码

#include <stdio.h>
#include<string.h>
#include<jni.h>


jstring
Java_org_linaro_jnitest_JNITest_modifyVariables(JNIEnv*env, jobject *o) {
jclass thisClass = (*env)->GetObjectClass(env,o);
jfieldID id_i = (*env)->GetFieldID(env,thisClass, "i", "I");
jfieldID id_s = (*env)->GetFieldID(env,thisClass, "s", "Ljava/lang/String;");
jfieldID id_sd = (*env)->GetStaticFieldID(env,thisClass, "sd", "D");
jfieldID id_ss = (*env)->GetStaticFieldID(env,thisClass, "ss", "Ljava/lang/String;");
jint c_i = (*env)->GetIntField(env, thisClass, id_i);
jstring c_s = (jstring)(*env)->GetObjectField(env,thisClass, id_s);
jdouble c_sd = (*env)->GetStaticDoubleField(env,thisClass, id_sd);
jstring c_ss = (jstring)(*env)->GetStaticObjectField(env, thisClass, id_ss);
char *cs_s = (*env)->GetStringUTFChars(env, c_s, NULL);
char *cs_sd = (*env)->GetStringUTFChars(env, c_sd,NULL);
char buf[512];
snprintf(buf, 512, "Variables initially seen by C code:\ni=%u\ns=%s\nsd=%f\nss=%s\n\n", c_i, cs_s, c_sd,cs_ss);
(*env)->ReleaseStringUTFChars(env, c_s, cs_s);
(*env)->ReleaseStringUTFChars(env, c_ss, cs_ss);
(*env)->SetIntField(env, thisClass, id_i, 1701);
(*env)->SetObjectField(env, thisClass, id_s,
(*env)->NewStringUTF(env, "Written in C"));
(*env)->SetStaticDoubleField(env, thisClass,id_sd, 3.1415926);
(*env)->SetStaticObjectField(env, thisClass,id_ss, (*env)->NewStringUTF(env, "JNI - C"));
return (*env)->NewStringUTF(env, buf);
}

当我在eclipse中运行程序时遇到这样的错误-

java.lang.unstaisfiedlinkerror:native library not included.

我也在 Android.mk 中包含了这个库。 请帮帮我...

【问题讨论】:

  • 格式化您的代码以使其可读会有所帮助

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


【解决方案1】:

在某种程度上,您正在调用一个在您忽略它时不存在的库。我不了解所有代码,但我建议您尝试查看是否已导入您的代码可以调用的所有库。

【讨论】:

    【解决方案2】:

    请发布您的 Android.mk 文件。还要确保为 application.mk 中指定的所有平台生成 JNITest.so 文件(默认情况下不存在,但您可以创建一个并指定 APP_ABI:=all 等参数,这意味着将创建一个 .so 文件适用于每个平台)。默认情况下,您应该至少看到在您的 jni 文件夹中创建的 arm 文件夹,并且它应该包含相应的 .so 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      相关资源
      最近更新 更多