Android monodroid项目中使用jni时发生意外崩溃

Android monodroid项目中使用jni时发生意外崩溃,android,java-native-interface,xamarin.android,xamarin,segmentation-fault,Android,Java Native Interface,Xamarin.android,Xamarin,Segmentation Fault,我一直在尝试使用Xamarin Studio将一个简单的hello world NDK项目导入monodroid项目 项目的NDK部分编译和构建得很好,我可以调用本机方法,但当我尝试访问JNIEnv时,应用程序会因SIGSEGV崩溃,请参阅下面的控制台输出和相关代码片段 Very basic console logging Starting method Accessing env Stacktrace: at <unknown> <0xffffffff> at

我一直在尝试使用Xamarin Studio将一个简单的hello world NDK项目导入monodroid项目

项目的NDK部分编译和构建得很好,我可以调用本机方法,但当我尝试访问
JNIEnv
时,应用程序会因SIGSEGV崩溃,请参阅下面的控制台输出和相关代码片段

Very basic console logging
Starting method
Accessing env
Stacktrace:

  at <unknown> <0xffffffff>
  at (wrapper managed-to-native) BasicNDK.Activity1.LogNdk (string) <IL 0x00032, 0xffffffff>
  at BasicNDK.Activity1.<OnCreate>b__0 (object,System.EventArgs) [0x00023] in c:\Users\cbramley\Documents\Visual Studio 2012\Projects\AndroidApplication1\BasicNDK\MainActivity.cs:56
  at Android.Views.View/IOnClickListenerImplementor.OnClick (Android.Views.View) [0x0000c] in /Users/builder/data/lanes/monodroid-mlion-master/bf2b736d/source/monodroid/src/Mono.Android/platforms/android-10/src/generated/Android.Views.View.cs:643
  at Android.Views.View/IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (intptr,intptr,intptr) [0x00011] in /Users/builder/data/lanes/monodroid-mlion-master/bf2b736d/source/monodroid/src/Mono.Android/platforms/android-10/src/generated/Android.Views.View.cs:614
  at (wrapper dynamic-method) object.6ea2e501-d56c-455b-9c13-849da747461e (intptr,intptr,intptr) <IL 0x00017, 0x00043>
  at (wrapper native-to-managed) object.6ea2e501-d56c-455b-9c13-849da747461e (intptr,intptr,intptr) <IL 0x00023, 0xffffffff>

=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================
非常基本的控制台日志记录
起动方法
访问环境
堆栈跟踪:
在
at(包装器管理为本机)BasicNDK.Activity1.LogNdk(字符串)
在c:\Users\cbramley\Documents\visualstudio 2012\Projects\android应用程序1\BasicNDK\MainActivity.cs:56中的BasicNDK.Activity1.b__0(object,System.EventArgs)[0x00023]处
在/Users/builder/data/lanes/monodroid-mlion-master/bf2b736d/source/monodroid/src/Mono.Android/platforms/Android-10/src/generated/Android.Views.cs:643中的Android.Views.View/IOnClickListenerImplementor.OnClick(Android.Views.View)[0x0000c]
在/Users/builder/data/lanes/monodroid-mlion-master/bf2b736d/source/monodroid/src/Mono.Android/platforms/Android-10/src/generated/Android.View.cs:614中的Android.Views.View/IOnClickListenerInvoker.n\u OnClick\u Landroid\u View\u View\u视图[0x00011]
at(包装器动态方法)object.6ea2e501-d56c-455b-9c13-849da747461e(intptr、intptr、intptr)
at(托管的本机包装器)对象6ea2e501-d56c-455b-9c13-849da747461e(intptr、intptr、intptr)
=================================================================
在执行本机代码时收到SIGSEGV。这通常表明
mono运行时或某个本机库中出现致命错误
由您的应用程序使用。
=================================================================
单机器人活动代码:

        // snipped rest of activity
        [DllImport ("ndksample")]
        static extern void LogNdk ( string w );

        [DllImport ("ndksample")]
        static extern void LogNdkDefaultMessage ();

        protected override void OnCreate ( Bundle bundle )
        {
            base.OnCreate ( bundle );
            SetContentView ( Resource.Layout.Main );

            Button button = FindViewById<Button> ( Resource.Id.myButton );            
            button.Click += delegate
            {
                // launch our NDK code                
                try
                {
                    LogNdkDefaultMessage();
                    LogNdk("Message to log");
                }
                catch (Exception e)
                {
                    Log.Warn("MainShort",e.ToString());
                }    
            };
        }
//截断了活动的其余部分
[DllImport(“ndksample”)]
静态外部无效LogNdk(字符串w);
[DllImport(“ndksample”)]
静态外部无效LogNdkDefaultMessage();
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
Button Button=FindViewById(Resource.Id.myButton);
按钮。单击+=委派
{
//启动我们的NDK代码
尝试
{
LogNdkDefaultMessage();
LogNdk(“消息到日志”);
}
捕获(例外e)
{
Log.Warn(“MainShort”,例如ToString());
}    
};
}
最后,NDK实现:

#include <jni.h>
#include <string.h>
#include <android/log.h>

#define DEBUG_TAG "NDK_AndroidNDK1SampleActivity"

void LogNdk(JNIEnv * env, jobject this, jstring logThis)
{
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Starting method");
    jboolean isCopy;
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Accessing env");
    const char * szLogThis = (*env)->GetStringUTFChars(env, logThis, &isCopy);
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szLogThis);
    (*env)->ReleaseStringUTFChars(env, logThis, szLogThis);
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Finished");
}

void LogNdkDefaultMessage(JNIEnv * env, jobject this)
{
   __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Very basic console logging");
}
#包括
#包括
#包括
#定义调试标记“NDK\U AndroidNDK1SampleActivity”
void LogNdk(JNIEnv*env、jobject this、jstring logThis)
{
__android_日志_打印(android_日志_调试,调试标签,“启动方法”);
jboolean-isCopy;
__android_日志_打印(android_日志_调试,调试标签,“访问环境”);
const char*szLogThis=(*env)->GetStringUTFChars(env、logThis和isCopy);
__android_log_打印(android_log_调试,调试标签,“NDK:LC:[%s]”,szLogThis);
(*env)->发布StringUTFChars(env、logThis、szLogThis);
__android_日志_打印(android_日志_调试,调试标签,“完成”);
}
void LogNdkDefaultMessage(JNIEnv*env,jobject this)
{
__android_log_print(android_log_DEBUG,DEBUG_标签,“非常基本的控制台日志记录”);
}

我已经在这行
constchar*szLogThis=(*env)->GetStringUTFChars(env,logThis,&isCopy)上跟踪到了一个崩溃问题但我不明白是什么引起的,有人能帮我解释一下吗?或者最好告诉我如何修复:)

我不是专家,但在monodroid项目中使用第三方JNI库有点困难。
这与我使用BindingLibrary类型的项目生成.jar c#-包装器(我将在我的Monodroid应用程序上使用)完全不同。
当BindingLibrary项目生成其代码时,您可以看到,如果它必须向JNI代码传递字符串,它会这样做:

IntPtr intPtr = JNIEnv.NewString ("string here");
...
callJNIMethodPassingString(new JValue (intPtr));

也许会有用。。或者可能根本没有:)

嗨,ScouseChris,你是否得到了关于上述问题的解决方案,我也遇到了同样的问题,如果你解决了问题,请让我知道,以便我可以解决我的问题。