JNI从c ++导出字符串到java

时间:2012-10-16 09:38:17

标签: android java-native-interface native

我有一个用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:

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:ERROR / AndroidRuntime(12303):致命异常:主要         java.lang.UnsatisfiedLinkError:getString         at com.testjni.ReadString.getString(Native Method)         at 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.ActivityThread.main(ActivityThread.java:4196)         at java.lang.reflect.Method.invokeNative(Native Method)         在java.lang.reflect.Method.invoke(Method.java:507)         在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)         在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)         在dalvik.system.NativeStart.main(本地方法)

我做错了什么?

3 个答案:

答案 0 :(得分: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”

答案 1 :(得分:1)

答案 2 :(得分:0)

您没有在.c文件中包含生成的.h文件,并且您根本没有生成.c文件,或者您已经从生成的内容中修改了函数声明。