1

私はc ++で書かれたクラスを持っています。Java クラスから読み取ることができるように、文字列を返すメソッドを作成したいと考えています。私は次のようなことをしようとしました:

読み取り文字列.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 */

読み取り文字列.java:

package com.testjni;

    public class ReadString {

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

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

アクティビティからの文字列の読み取り:

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();
    }
}

スタックトレースは次のとおりです。

10-16 12:35:09.974: エラー/AndroidRuntime(12303): 致命的な例外: メイン java.lang.UnsatisfiedLinkError: com.testjni.ReadString.getString(ネイティブ メソッド) の getString com.testjni.ReadString.getText(ReadString. java:10) で com.testjni.TestJNI.onCreate(TestJNI.java:13) で android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) で android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1780) でandroid.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837) で android.app.ActivityThread.access$1500(ActivityThread.java:132) で android.app.ActivityThread$H.handleMessage(ActivityThread.java:1033) で android. os.Handler.dispatchMessage(Handler.java:99) で android.os.Looper.loop(Looper.java:143) で android.app.com.android.internal.os. ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(ネイティブ メソッド)

私は何を間違っていますか?

4

3 に答える 3

1

"Java_com_googlecode_leptonica_android_ReadFile__getString"

ここで、パッケージは「com.googlecode.leptonica.android」、クラスは「ReadFile」、関数は「getString」です。

実際、コードでこの関数について言及していませんでした。確認してください。

このように使う

Cコードの「Java_com_testjni_ReadString__getString()」の代わりに

"Java_com_googlecode_leptonica_android_ReadFile__getString"

于 2012-10-16T09:57:04.937 に答える
1

このチュートリアルが役立つかもしれません

http://marakana.com/bookshelf/java_fundamentals_tutorial/_java_native_interface_jni.html

于 2012-10-16T10:02:49.677 に答える
0

生成された .h ファイルを .c ファイルに含めていません。また、.c ファイルをまったく生成していないか、生成されたものから関数宣言を破損しています。

于 2012-10-16T09:40:41.223 に答える