【问题标题】:JNI export string from c++ to javaJNI 将字符串从 c++ 导出到 java
【发布时间】:2012-10-06 08:59:56
【问题描述】:

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

读取字符串.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:getString 在 com.testjni.ReadString.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.ActivityThread.main(ActivityThread.java:4196) 在 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(Native Method)

我做错了什么?

【问题讨论】:

    标签: android java-native-interface native


    【解决方案1】:

    您没有将生成的 .h 文件包含在 .c 文件中,或者根本没有生成 .c 文件,或者您已经从生成的文件中破坏了函数声明。

    【讨论】:

    • 它没有生成 .c 文件和 .h 文件。我刚刚在我的项目的 jni 文件夹中运行了 android-ndk 命令
    【解决方案2】:

    “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”

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 2012-07-08
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 2019-11-28
      • 1970-01-01
      • 2010-10-26
      相关资源
      最近更新 更多