java - JNI 函数导致 Android 应用程序崩溃

标签 java android parameters crash java-native-interface

我有以下 JNI 函数,它将事件发送到我的 Java 代码。

void onIncrementAchievement(unsigned char _iArgumentCount, const void *_pArguments, void *_pUserData){
JNIEnv *pJNIEnv = GetJNIEnv();
if (pJNIEnv){

        if ( _pArguments && ( _iArgumentCount > 0 ) ){
                const S3DX::AIVariable *pVariables = (const S3DX::AIVariable *)_pArguments ;

                if(_iArgumentCount != 2)
                        LOGI("INCORRECT NUMBER OF PARAMETERS");
                else{
                        if(pVariables[0].GetType() == S3DX::AIVariable::eTypeString){
                                // CHANGE ME!
                                jclass pJNIActivityClass = pJNIEnv->FindClass ( "com/nurfacegames/testgame01/TestGame01" );

                                if(pJNIActivityClass == NULL)
                                        LOGI("jclass was null!?!");
                                else{
                                        jmethodID pJNIMethodID = pJNIEnv->GetStaticMethodID(pJNIActivityClass, "onIncrementAchievement", "(Ljava/lang/String;Ljava/lang/Integer;)V");

                                        if(pJNIMethodID == NULL)
                                                LOGI("jmethodID was null!?!?");
                                        else{
                                                //Create a new string
                                                jstring arg;
                                                arg = pJNIEnv->NewStringUTF(pVariables[0].GetStringValue());

                                                jint arg2 = pVariables[1].GetNumberValue();

                                                //Call the method and pass the string parameter along
                                                pJNIEnv->CallStaticVoidMethod(pJNIActivityClass, pJNIMethodID, arg, arg2);
                                                //Free the string
                                                pJNIEnv->DeleteLocalRef(arg);
                                        }
                                }
                        }
                }
        }
}
}

当我运行 Android 应用程序时,它会强制关闭,甚至不会在 logcat 中给出任何错误,并且当我使用 Ant 编译时,不会出现编译错误。

我讨厌发布这样一个模糊的问题,但是如果有人知道我的 JNI 代码有什么问题,请给我一个提示。谢谢!

我认为有问题的领域(我一直在努力)是:

 if(_iArgumentCount != 2)
                        LOGI("INCORRECT NUMBER OF PARAMETERS");
                else{

以及本节:

jint arg2 = pVariables[1].GetNumberValue();

pJNIEnv->CallStaticVoidMethod(pJNIActivityClass, pJNIMethodID, arg, arg2);

谢谢!

最佳答案

好吧,看看你的方法名称void onIncrementAchievement,据我所知,这不是在 native 部分声明你的方法的正确方法,它应该是:

Java_com_example_yourpackagename_youractivityname_yourmethod(...)

还有一件事,我猜你的方法中的参数也是错误的,请查看 this tutorial .

关于java - JNI 函数导致 Android 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394517/

相关文章:

java - 为什么类的私有(private)成员可以在compareTo中访问?

java - 使用 Oracle 10g 时 Hibernate 的浮点列模式验证已知问题的最佳解决方法是什么?

android studio 3.0.1 永远在 android profiler 中获取内存分配的结果

android - Spinner 在我的 Activity 开始时被激活

带通配符的 BASH 参数

c++ - 参数传递的不同矩阵结构

java - 为什么 java.io.File 没有 close 方法?

java - 如何将可选<List<A>>转换为可选<List<B>>

安卓 : upload Image and JSON using MultiPartEntityBuilder

asp.net - 如何在 ASP.NET MVC 中向 Partial View 传递参数?