2011-09-11 117 views
2

我有一个测试用例,其中java在C中调用了一个简单的例程,并带有几个参数,它返回一个字符串,它可以工作。Android本机代码崩溃

但是,当我编写我的真实代码时,它以与“调用目标异常”崩溃相同的方式。然后我把它简化为一个调用并返回一个字符串,它仍然崩溃。

这两种情况之间的一个区别是其中一个调用有6个浮点参数,另一个有14个浮动ars。第一个被调用的6-arg(一个设置),我得到了异常。

对调用本机代码的参数数量是否有任何实际限制?还是应该继续在别处查看我的代码?

对不起 - 我不能将logcat格式化为注释,所以我将它作为编辑发布。这里是logcat,我应该看什么建议? “未找到实现”是什么意思?

D/dalvikvm( 531): Added shared lib /data/data/com.kinyur.etold/lib/libgalib.so 0x405133e0 
D/dalvikvm( 531): No JNI_OnLoad found in /data/data/com.kinyur.etold/lib/libgalib.so 0x405133e0, skipping init 
W/dalvikvm( 531): No implementation found for native Lcom/kinyur/etold/NativeLib;.setup (FFFFFF)Ljava/lang/String; 
D/AndroidRuntime( 531): Shutting down VM 
W/dalvikvm( 531): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
E/AndroidRuntime( 531): FATAL EXCEPTION: main 

该例程调用6个浮标并返回一个String类型。 “设置”是我在碰撞时调用的例程的名称。

+0

你介意发布您的本地函数的原型,对应的Java原型,它是失败的例子调用?相关的logcat条目也很有用。 – JesusFreke

+1

14 args @ _ @ @重构? – Xorlev

+0

感谢您向我保证问题不是arg限制。在我寻求更多帮助之前,我会再花一天时间 - 如果我能找到它,它会节省您的时间。我跑了logcat,看到了这个,也许你可以给我一个指向哪里看? –

回答

1

的论据很抱歉的分心数的任何限制,我花了这一切的一天,发现问题,只是我的一个愚蠢的错字,可能是一个复制粘贴问题。

有趣的是,我用try ... catch块保护了本地调用,但程序仍然崩溃而不是发生异常。

我有两个问题。第一个主要的是:

我的.C文件中的例程装饰名称是错误的。在这种工作我的测试情况下,我用的是:

JNIEXPORT jstring JNICALL Java_com_example_atest_NativeLib_hello 

,并在我的现实情况下,我想:

JNIEXPORT jstring JNICALL Java_com_kinyur_etold_NativeLib_doSetup 

但我不得不为:

JNIEXPORT jstring JNICALL Java_com_example_atest_NativeLib_doSetup 

,所以我不得不克鲁夫特从我将复制的案例复制到新的案例中遗留下来。我不知道我今天看了多少次,没有注意到它。 :-(

有意思的是,根据logcat的,它似乎链接到库OK,当它运行失败(使用常规的名字“你好”,而不是“doSetup”):

D/dalvikvm( 460): Trying to load lib /data/data/com.kinyur.etold/lib/libgalib.so 0x40515840 
D/dalvikvm( 460): Added shared lib /data/data/com.kinyur.etold/lib/libgalib.so0x40515840 
D/dalvikvm( 460): No JNI_OnLoad found in /data/data/com.kinyur.etold/lib/libgalib.so 0x40515840, skipping init 
W/dalvikvm( 460): No implementation found for native Lcom/kinyur/etold/NativeLib;.hello()Ljava/lang/String; 
D/AndroidRuntime( 460): Shutting down VM 
W/dalvikvm( 460): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
E/AndroidRuntime( 460): FATAL EXCEPTION: main 
E/AndroidRuntime( 460): java.lang.UnsatisfiedLinkError: hello 
E/AndroidRuntime( 460):  at com.kinyur.etold.NativeLib.hello(Native Method) 
E/AndroidRuntime( 460):  at com.kinyur.etold.ComFields.<init>(ComFields.java:33) 
E/AndroidRuntime( 460):  at com.kinyur.etold.EtMain.onCreate(EtMain.java:28) 
E/AndroidRuntime( 460):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 

我在寻找第一个问题时发现的第二个问题是,我在C例程中错误地返回了一个字符串。

我:

​​

需要的是:

return (*env)->NewStringUTF(env, aString);