2014-12-04 48 views
0

使用JNI我的C程序訪問Java程序中聲明的變量這是我的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中包含了該庫。 請幫我...

+0

格式化您的代碼,使其可讀性將有助於 – 2014-12-04 11:04:18

回答

0

在某種程度上,你呼喚一個圖書館,當你忽視它時,它不存在。我不明白所有代碼,但我建議您嘗試查看是否所有可以通過代碼調用的庫都已導入。

0

請發佈您的Android.mk文件。還要確保爲您的application.mk中指定的所有平臺生成JNITest.so文件(默認情況下,這個文件不存在,但您可以創建一個並指定像APP_ABI這樣的參數:= all,這意味着將創建一個.so文件爲每個平臺)。默認情況下,您應該至少看到在jni文件夾中創建的arm文件夾,它應該包含相應的.so文件。