【发布时间】:2012-01-31 18:22:33
【问题描述】:
我遇到了错误:在 Java 虚拟机之外的本地代码中发生崩溃。每当我使用带有本机库和 .net 模块文件的类文件运行时,它都可以正常工作。 但是当我尝试单独运行类文件和本机库时,它会崩溃。请澄清我所做的错误,请检查我的代码。 参数供您参考
============================================
public class Sum
{
public int add(int a, int b)
{
return a + b;
}
}
=============================================
另存为 Sum.cs 并编译成模块 使用cmd:
csc /t:module sum.cs
创建要测试的 Java 文件
=============================================
public class test{
public native int add(int a,int b);
static {
System.loadLibrary("JSample");
}
public static void main (String[] args) {
System.out.println(new test().add(10,15));
}
}
============================================
另存为 test.java 编译为
javac test.java
创建原生头文件
javah -jni 测试
它将创建 test.h
使用visual studio创建win32项目(我用的是VS2010) 选择项目名称为 JSample
包含头文件和 C#.net 模块 编写用于管理 C++ 转换的标头
===============================================
#using <mscorlib.dll>
#using "Sum.netmodule"
using namespace System;
public __gc class SumC
{
public:
Sum __gc *t;
SumC()
{
t = new Sum();
}
int callCSharpSum(int a,int b)
{
return t->add(a,b);
}
};
=============================================
将其保存为 sum.h
创建 sum.cpp 文件
=============================================
#include <jni.h>
#include "test.h"
#include "sum.h"
JNIEXPORT jint JNICALL Java_test_add
(JNIEnv *, jobject, jint a, jint b)
{
SumC* t = new SumC();
return t->callCSharpSum(a ,b );
}
==============================================
优化编译器以构建 /clr:oldSyntax 包含Jdk/包含目录路径 构建项目。 我们将获取 JSample DLL
运行项目 与 C#.net 模块、本地 DLL 文件和类文件在同一文件夹中。
java 测试
25
但每当我使用 dll 文件和类文件单独运行代码时。 它显示错误报告崩溃发生在 Java 虚拟机之外的本地代码中。 请阐明如何将托管代码 C# 移植到 C++(Win32 非托管代码)。库文件。
【问题讨论】:
-
为了简化您的示例,您无需在任何地方创建(或释放)对象。我只有一个可以运行的 Linux,所以我不知道你的错误是什么,也许你可以发布一个简短的摘要,这样每个人都会知道你在说什么。
标签: c# java ubuntu managed-c++