2012-10-16 76 views
1

我有一個用C++編寫的類。我想寫一個方法來返回一個字符串,所以我可以從我的Java類讀取它。我試着這樣做:JNI從C++輸出字符串到java

readstring.cpp:

#include "common.h" 
#include <string.h> 

#ifdef __cplusplus 
extern "C" { 
#endif /* __cplusplus */ 

/************ 
* ReadString * 
************/ 

jstring Java_com_googlecode_leptonica_android_ReadFile__getString(JNIEnv *env, jclass clazz) 
{ 
    jstring result = env->NewStringUTF("My String"); 
return result; 
} 

#ifdef __cplusplus 
} 
#endif /* __cplusplus */ 

Readstring.java:

public class TestJNI extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ReadString readString = new ReadString(); 
     Toast.makeText(this, readString.getText(), Toast.LENGTH_SHORT).show(); 
    } 
} 

和堆棧:

package com.testjni; 

    public class ReadString { 

     static { 
      System.loadLibrary("lept"); 
     } 

     public String getText(){ 
      return getString(); 
     } 
     private static native String getString(); 
    } 

從活動中讀取字符串跟蹤是:

10-16 12:35:09.974:ERROR/AndroidRuntime(12303):致命例外:main java.lang.UnsatisfiedLinkError:getString at com.testjni.ReadString.getString(Native Method) at com.testjni.ReadString。 get.Text(ReadString.java:10) at com.testjni.TestJNI.onCreate(TestJNI.java:13) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) at android.app.ActivityThread.performLaunchActivity( Activity.Thread.java:1780) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837) at android.app.ActivityThread.access $ 1500(ActivityThread.java:132) at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1033) at android.os .Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:143) at android.app.ActivityThread.main(ActivityThread.java:4196) at java.lang.reflect .Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839) at (本地方法)

我在做什麼錯?

回答

1

「Java_com_googlecode_leptonica_android_ReadFile__getString」

這裏你的包是 「com.googlecode.leptonica.android」 和類 「的ReadFile」 和功能 「的getString」。

其實你沒有提到這個功能在你的代碼。請檢查。

使用這樣

「Java_com_testjni_ReadString__getString()」 在你的C代碼,而不是

「Java_com_googlecode_leptonica_android_ReadFile__getString」

+0

的jni文件夾中運行了android-ndk命令,我認爲軟件包名稱是錯誤的。 –

+0

你是對的。謝謝 –

+0

ok @gabi。歡迎。 –

0

您還沒有包含在.c文件生成的.h文件中,你要麼不產生在所有.c文件或已錯位,從產生什麼樣的函數聲明。

+0

事與願違生成.c文件和.h文件。我剛剛在我的項目 –