首页 > 解决方案 > android jni调用方法错误

问题描述

以下是我的代码

JNIEXPORT jstring JNICALL Java_demo_emi365_com_natives_Hello_sayHello
        (JNIEnv *env, jclass clazz){
    char* classname = "demo/emi365/com/natives/Hello";
    jmethodID methodID = (*env)->GetMethodID(env, clazz,"function", "(Ljava/lang/String;)I");
    jstring param = (*env)->NewStringUTF(env, "C中调用Java的String参数方法");
    (*env)->CallIntMethod(env,clazz,methodID,NULL);
    return (*env)->NewStringUTF(env,"hello");
}

如果注解 CallIntMethod 一切正常,但添加会崩溃如下错误信息:</p>

    pid: 6893, tid: 6893, name: demo.emi365.com  >>> demo.emi365.com <<<
06-05 11:23:32.398 252-252/? I/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
06-05 11:23:32.554 252-252/? I/DEBUG:     eax 00000000  ebx 00001aed  ecx 00001aed  edx 00000006
06-05 11:23:32.554 252-252/? I/DEBUG:     esi 00001aed  edi 0000000b
06-05 11:23:32.554 252-252/? I/DEBUG:     xcs 00000073  xds 0000007b  xes 0000007b  xfs 00000000  xss 0000007b
06-05 11:23:32.554 252-252/? I/DEBUG:     eip 4006d0a6  ebp 400d1ce0  esp bfcb5490  flags 00200203
06-05 11:23:32.554 252-252/? I/DEBUG: backtrace:
06-05 11:23:32.554 252-252/? I/DEBUG:     #00  pc 0003c0a6  /system/lib/libc.so (tgkill+22)
06-05 11:23:32.554 252-252/? I/DEBUG:     #01  pc 00000005  <unknown>
06-05 11:23:32.554 252-252/? I/DEBUG: stack:
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5450  00000000  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5454  400cd268  /system/lib/libc.so
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5458  00000000  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb545c  4003efe9  /system/lib/libc.so (pthread_mutex_unlock+25)
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5460  400cd18c  /system/lib/libc.so
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5464  80255600  [heap]
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5468  00000015  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb546c  4003efe9  /system/lib/libc.so (pthread_mutex_unlock+25)
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5470  00000000  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5474  4008bad6  /system/lib/libc.so (funlockfile+6)
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5478  400ccfcc  /system/lib/libc.so
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb547c  400770f6  /system/lib/libc.so (__sflush_locked+150)
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5480  00000000  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5484  00000000  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5488  4003ee19  /system/lib/libc.so (pthread_mutex_lock+9)
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb548c  400ccfcc  /system/lib/libc.so
06-05 11:23:32.554 252-252/? I/DEBUG:     #00  bfcb5490  00000006  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5494  00001aed  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb5498  400ccfcc  /system/lib/libc.so
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb549c  40049826  /system/lib/libc.so (pthread_kill+102)
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54a0  00001aed  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54a4  00001aed  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54a8  00000006  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54ac  00000000  
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54b0  400cd268  /system/lib/libc.so
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54b4  4273ece1  /system/lib/libdvm.so
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54b8  400497c9  /system/lib/libc.so (pthread_kill+9)
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54bc  400ccfcc  /system/lib/libc.so
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54c0  bfcb550c  [stack]
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54c4  bfcb574c  [stack]
06-05 11:23:32.554 252-252/? I/DEBUG:          bfcb54c8  42ea29f0  

/dev/ashmem/dalvik-heap(已删除)06-05 11:23:32.554 252-252/?I/DEBUG: bfcb54cc 40049bec /system/lib/libc.so (raise+44)

标签: androidjava-native-interface

解决方案


如果本地方法function()不是static,它需要一个jobject,而不是jclasss作为第二个参数。

如果它是静态的,如下所示,你必须通过(*env)->CallStaticIntMethod(…<code>)调用它。

package demo.emi365.com.natives;

public class Hello { 
    public String native static sayHello();
    public int static function(String param) {
        return 1;
    }
}

推荐阅读