2023-01-20 286
我正在尝试在Android中运行一个简单的JNI代码,但是我变得不舒服.
这是我的Java代码:
package com.lipcap;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
TextView a;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
a=new TextView(this);
String b;
MainActivity ob=new MainActivity();
b=ob.sniff();
a.setText(b);
setContentView(a);
}
public native String sniff();
static{
System.loadLibrary("native");
}
}
这是我的C ++代码(在$ project_path/jni/):
#include<iostream>
#include<string.h>
#include<jni.h>
JNIEXPORT jstring JNICALL Java_com_lipcap_MainActivity_sniff
(JNIEnv *env, jobject obj){
return env->NewStringUTF("This is Native");
}
我使用Javac遵守了Java代码,并使用Javah制作标头.
然后我运行了ndk-build.
然后我从Eclipse运行代码.(在Android中安装了APK).
我得到此错误:
E/AndroidRuntime( 769): FATAL EXCEPTION: main
E/AndroidRuntime( 769): java.lang.UnsatisfiedLinkError: sniff
E/AndroidRuntime( 769): at com.lipcap.MainActivity.sniff(Native Method)
E/AndroidRuntime( 769): at com.lipcap.MainActivity.onCreate(MainActivity.java:36)
E/AndroidRuntime( 769): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime( 769): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime( 769): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime( 769): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime( 769): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime( 769): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 769): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 769): at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 769): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 769): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 769): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 769): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 769): at dalvik.system.NativeStart.main(Native Method)
我尚未设置ld_library_path.
但是,不设置ld_library_path示例代码,例如NDK提供的hellojni,绝对不错.
请告诉我我在哪里缺少.
您提到的Richard-head:”将代码从C ++更改为C一切正常” …
我被完全相同的问题折磨了几天,我确实确保了我键入的所有内容(命名,android.mk等)没有问题.每当C中,我都很好.只要我更改为cpp,UnsatisfiedLinkError.
我终于得到了此链接的提示:
http://markmail.org/message/message/fhbnprmp2m7ju6lc
这全都是因为C ++名称混乱!相同的函数,如果您在.cpp文件中没有extern “C” extern “C”,则该名称被弄糊,因此JNI找不到函数名称,因此UnsatisfiedLinkError弹出.
在您的功能周围戴上并删除extern “C” { },运行nm obj/local/armeabi/libnative.so,您将清楚地看到相同的功能,而无需和Name Mangling.
我希望这也能帮助他人解决同样的问题.
这并不是很正确的…
尝试:
package com.lipcap;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
TextView a;
public native String sniff();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
a=new TextView(this);
String b = sniff();
a.setText(b);
setContentView(a);
}
static{
System.loadLibrary("native");
}
}
最后…这是您的android.mk?
LOCAL_MODULE := native
我会给另一个建议.我之前遇到了同样的错误,但我通过” Android Native Development套件”解决了此问题.请注意这些语句;
本机函数必须遵循包装名称,类名称和方法名称的特定模式.包和类名称必须与Java类的包和类名称一致,虽然方法名称必须与该Java类中声明的方法名称相同.
这有助于Dalvik VM在运行时找到本机函数.遵循该规则将导致运行时的undefiedlinkerror.
例如上述
您需要更改您的函数名称,例如(如果专注于NDK,请勿使用com.bla)
#include<iostream>
#include<string.h>
#include<jni.h>
JNIEXPORT jstring JNICALL Java_lipcap_example_MainActivity_sniff
(JNIEnv *env, jobject obj){
return env->NewStringUTF("This is Native");
}
以上所述是小编给大家介绍的安卓系统中的不满意linkerror(eclipse),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26133.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态