为什么在c++;图书馆崩溃应用程序? 我试图通过java中的线程,在C++库中引用一个引用:

为什么在c++;图书馆崩溃应用程序? 我试图通过java中的线程,在C++库中引用一个引用:,java,android,c,pointers,java-native-interface,Java,Android,C,Pointers,Java Native Interface,但是,当我运行应用程序时,它会立即崩溃。有人能看看我做错了什么吗?我的头发拉长了 编辑: 应超级用户michael的请求添加了完整代码和堆栈跟踪。如果testingHandle bool设置为false,代码运行正常。如果设置为true,则会崩溃 编辑2:而且,这是一个打字错误。。。固定在下面 申请代码: package com.AndroidCPP; import android.app.Activity; import android.widget.TextView; import and

但是,当我运行应用程序时,它会立即崩溃。有人能看看我做错了什么吗?我的头发拉长了

编辑: 应超级用户michael的请求添加了完整代码和堆栈跟踪。如果testingHandle bool设置为false,代码运行正常。如果设置为true,则会崩溃

编辑2:而且,这是一个打字错误。。。固定在下面

申请代码:

package com.AndroidCPP;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
import android.util.Log;


public class AndroidCPP extends Activity
{
    //Set Activity tag for logging (adb command: adb logcat *:s AndroidCPP:V)
    private static final String TAG = "AndroidCPP";


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        boolean testingHandle = true;
        if(testingHandle)
        {
            DynamicLib newLib = new DynamicLib();
            newLib.Init();
            newLib.CleanUp();
        }   

        //pull device info from lib
        int libNum = DynamicLib.GetNumber(3);
        String ipAddress = DynamicLib.GetLocalIPv4();
        String serialNumber = DynamicLib.GetSerialNumber();

        //Textview will only work on regular android device, you'll be in the black void if run on a quest
        TextView  tv = new TextView(this);

        String textViewString = String.format("Here is a number that was the cause of addition in a C++ library : %d \n", libNum);
        textViewString += String.format("Here is the IP Adrress Pulled from the DL:  %s", ipAddress);
        textViewString += "\n";
        textViewString += "Here is the IP Address Pulled from Java Utils: " + Utils.getIPAddress(true);
        textViewString += "\n";
        textViewString += String.format("Here is the serial Number pulled from DL: %s", serialNumber);

        tv.setText(textViewString);

        //Logcat Log
        Log.v(TAG, "");
        Log.v(TAG, "***************");
        Log.v(TAG, "JAVA ip: " + Utils.getIPAddress(true));
        Log.v(TAG, "C++ ip :" + ipAddress);
        Log.v(TAG, "JAVA MAC : " + Utils.getMACAddress("wlan0"));
        Log.v(TAG, "Serial Number : " + serialNumber);

        setContentView(tv);
    }
}

java方面:

package com.AndroidCPP;

class DynamicLib
{
    static{
        System.loadLibrary("DynamicLib");
    }

    long testHandle = 0;

    public void Init()
    {
        testHandle = CreateMemory();
    }

    public void CleanUp()
    {
        FreeMemory(testHandle);
    }

    public native long CreateMemory();

    public native void FreeMemory(long ptr);

    public static native int GetNumber(int testParameter);

    public static native String GetLocalIPv4();

    public static native String GetSerialNumber();

}
CPP方面:

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

#include "TestClass.h"
#include "IPFetch.h"


#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "DynamicLib", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "DynamicLib", __VA_ARGS__))


extern "C" {

    JNIEXPORT jlong JNICALL Java_com_AndroidCPP_DynamicLib_CreateMemory(JNIEnv* env, jobject obj)
    {
        DynamicLib::testStruct* newPtr = new DynamicLib::testStruct();
        return (jlong)newPtr;
    }

    JNIEXPORT void JNICALL Java_com_AndroidCPP_DynamicLib_FreeMemory(JNIEnv* env, jobject obj, jlong ptr)
    {
        DynamicLib::testStruct* tempStructPtr = (DynamicLib::testStruct*)ptr;
        delete tempStructPtr;
    }

    JNIEXPORT int JNICALL Java_com_AndroidCPP_DynamicLib_GetNumber(JNIEnv* env, jobject obj, int testParameter)
    {
        LOGI("Calling Get Number From Dynamic Lib With Test Parameter %d", testParameter);
        DynamicLib::TestClass testClass;
        return testClass.AddTwoNumbers(testParameter, 2);
    }

    JNIEXPORT jstring JNICALL Java_com_AndroidCPP_DynamicLib_GetLocalIPv4(JNIEnv* env, jobject obj)
    {
        DynamicLib::IPFetch ipFetch;
        jstring returnString = env->NewStringUTF(ipFetch.FetchLocalIPv4().c_str());
        return returnString;
    }

    JNIEXPORT jstring JNICALL Java_com_AndroidCPP_DynamicLib_GetSerialNumber(JNIEnv* env, jobject obj)
    {
        DynamicLib::IPFetch ipFetch;
        return env->NewStringUTF(ipFetch.FetchSerialNumber().c_str());
    }
}


<>你的C++多长时间>长< /强>? <> C++中的大小是特定于实现的,唯一的要求是它至少有32位。有些编译器的longint为32位,指针为64位


<>最好使用C++中的C++ >强> > uutn64→<强>。 <> C++中的大小是特定于实现的,唯一的要求是它至少有32位。有些编译器的longint为32位,指针为64位


<>最好使用C++中的“强> uut64”t <强>。

这行有问题:

return (long)newPtr;
long
jlong
不是相同的数据类型,后者可能更宽。转换为
jlong

return (jlong)newPtr;

这一行有问题:

return (long)newPtr;
long
jlong
不是相同的数据类型,后者可能更宽。转换为
jlong

return (jlong)newPtr;
“未找到长com.AndroidCPP.DynamicLib.CreateMemory的实现”

您的代码中有一个输入错误:Java\u com\u AndroidCPP\u DynamciLib\u CreateMemory

这应该是:Java\u com\u AndroidCPP\u DynamicLib\u CreateMemory

对于
freemory

“未找到long com.AndroidCPP.DynamicLib.CreateMemory的实现”

您的代码中有一个输入错误:Java\u com\u AndroidCPP\u DynamciLib\u CreateMemory

这应该是:Java\u com\u AndroidCPP\u DynamicLib\u CreateMemory


对于
freemory

也一样,我知道jlong是typedef到long(64位)。我也尝试过返回(jlong)newPtr和(jlong)(uint64_t)newPtr,但没有成功。应用程序不断崩溃,出现“程序以信号SIGKILL终止,终止”。还应该注意的是,我在运行静态函数进行简单运算时没有问题。我知道jlong是typedef到long(64位)。我也尝试过返回(jlong)newPtr和(jlong)(uint64_t)newPtr,但没有成功。应用程序不断崩溃,出现“程序以信号SIGKILL终止,终止”。还应该注意,我在运行静态函数进行简单运算时没有问题。我还尝试返回(jlong)newPtr和(jlong)(uint64_t)newPtr,但没有成功。应用程序不断崩溃,出现“程序以信号SIGKILL终止,终止”。还应该注意,我在运行静态函数进行简单运算时没有问题。我还尝试返回(jlong)newPtr和(jlong)(uint64_t)newPtr,但没有成功。应用程序不断崩溃,“程序终止信号为SIGKILL,Killed。”还应该注意,我在运行静态函数时做简单的算术运算没有问题。请发布您正在运行的实际代码。您的C++函数将始终接收<代码> JNENV*<代码>,或者<代码> JOBJET< <代码>或<代码> JCys,但是在您所示的代码中,这些代码被省略了。还有,崩溃堆栈跟踪指向哪一行代码?@Michael我已经包含了你要求的帖子的更新,但没有。我是在1998年这样做的。找不到JNI方法也不是“崩溃”。很好,非常有用的insight@user207421请发布您正在运行的实际代码。您的C++函数将始终接收<代码> JNENV*<代码>,或者<代码> JOBJET< <代码>或<代码> JCys,但是在您所示的代码中,这些代码被省略了。还有,崩溃堆栈跟踪指向哪一行代码?@Michael我已经包含了你要求的帖子的更新,但没有。我是在1998年这样做的。找不到JNI方法也不是“崩溃”。很好,非常有用的洞察@user207421omg,谢谢你,很明显我在这方面做得太久了。读了一千遍。我想我会把这个放在这里,以防有人想用它作为参考…天哪,谢谢你,显然我在这方面已经演得太久了。读了一千遍。我想我会把这个留在这里,以防有人想用它作为参考。。。