为什么在c++;图书馆崩溃应用程序? 我试图通过java中的线程,在C++库中引用一个引用:
但是,当我运行应用程序时,它会立即崩溃。有人能看看我做错了什么吗?我的头发拉长了 编辑: 应超级用户michael的请求添加了完整代码和堆栈跟踪。如果testingHandle bool设置为false,代码运行正常。如果设置为true,则会崩溃 编辑2:而且,这是一个打字错误。。。固定在下面 申请代码:为什么在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
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位。有些编译器的long和int为32位,指针为64位
<>最好使用C++中的C++ >强> > uutn64→<强>。 <> C++中的大小是特定于实现的,唯一的要求是它至少有32位。有些编译器的long和int为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,谢谢你,很明显我在这方面做得太久了。读了一千遍。我想我会把这个放在这里,以防有人想用它作为参考…天哪,谢谢你,显然我在这方面已经演得太久了。读了一千遍。我想我会把这个留在这里,以防有人想用它作为参考。。。