我有一个用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(本地方法)
我做错了什么?
答案 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)
本教程可能会对您有所帮助
http://marakana.com/bookshelf/java_fundamentals_tutorial/_java_native_interface_jni.html
答案 2 :(得分:0)
您没有在.c文件中包含生成的.h文件,并且您根本没有生成.c文件,或者您已经从生成的内容中修改了函数声明。