情境:我有一个实现了JNI的dll,我想从一个Cpp应用程序调用其中的方法。
当前状态:根据我的理解,一个实现了JNI的dll实际上与JAVA无关,例如:在test.JAVA中,我编写了Public native int Add(int a,int b);
并在testdll.cpjniexport jintjnicall Java_SomeNamespace_Add(jnienv*_env,jobject_object,jinta,jintb){return a+b;}
我认为这样的程序与JVM无关,jint结构似乎已经在JNI.h中完全定义了。
因此,我想知道是否可以直接调用java_somenamespace_add
而不从Cpp应用程序创建VM,如果可以,请:
对于第一个问题,我认为使用一些重构来创建一个简单的替代方案是一个好主意。
不是将算法的逻辑放入JNI调用本身,而是将逻辑移到一个单独的C++函数中,并从两个用例中调用该函数。
即:
// MyJNIWrapper.cpp
#include "MyMathFunctions.h"
JNIEXPORT jint JNICALL Java_SomeNamespace_Add(JNIEnv* _Env, jobject _Object, jint a, jint b)
{
return (jint)add((int)a, (int)b);
}
// MyMathFunctions.h
int add(int a, int b)
{
return a + b;
}
// MyCppProgram.cpp
#include "MyMathFunctions.h"
int main()
{
int c = add(a, b)
}
int a = 10;
jint b = (jint) a;
int c = (int) b
JNIEXPORT void JNICALLJava_MyJavaClass_printName(JNIEnv *env, jobject obj, jstring name)
{
const char *str= (*env)->GetStringUTFChars(env,name,0);
printf(“%s”, str);
//need to release this string when done with it in order to
//avoid memory leak
(*env)->ReleaseStringUTFChars(env, name, str);
}
要从上面的C字符串转换为std::string,可以执行以下操作:
std::string cpp_string = str;
如果您没有使用JNI调用函数,那么您将需要尝试并滚动您自己的转换。我想看看你是否可以使用一个现有的VM实现,弄清楚他们是怎么做的,然后模仿它。
例如,您可以将以下内容作为起点来尝试Android VM:https://Android.googlesource.com/platform/dalvik/+/donut-release/VM/jni.c#2230 https://Android.googlesource.com/platform/dalvik.git/+/android-4.3_r3/VM/utfstring.cpp#284
本文向大家介绍C++调用C#的DLL实现方法,包括了C++调用C#的DLL实现方法的使用技巧和注意事项,需要的朋友参考一下 SwfDotNet是C#编写的,这是个特别好的读写Swf文件的库。本文讲述了在C++项目中,怎么让C++调用C#的DLL动态链接库文件。 具体的实现步骤如下: 一、创建C# DLL,需要指定应用类型为“类库”,代码: 二、C++客户程序,是个控制台应用,代码: 三、这里有几点
问题内容: 我正在将Java用于小型应用程序。这是对现有MFC项目的重写。我需要更改一个现有的dll,以启用使用JNI从Java进行的访问。所有这些Java知识对我来说都是新手,因此当我阅读其他论坛帖子时遇到了一些麻烦,并且感觉比较密集。在现有的dll中,我具有如下功能: 愚蠢的提问时间。如何正确设置它以被Java调用? 我尝试了这个: 我包括jni.h,一切编译正常。但是,当我从Java调用它时
问题内容: 我有一个用c#创建的dll,在调用时会执行一些数据库操作。我必须将一些参数从Java应用程序传递到dll中的方法。关于如何执行此操作的任何想法。 要么 通过Java应用程序在c#中调用方法的更好的主意吗? 谢谢 编辑:我的Java应用程序是AVAYA平台的标准Dialogue Designer应用程序,并且我已经开发了一个仅在.net SDK上工作的C#应用程序。所以我需要将数据从
我在visual studio中创建了一个dll(我没有使用任何win\u API函数)。我想从我生成的android.apk文件中调用这个dlll,但在运行这个文件时,我遇到了这个错误。 "java.lang.无法从加载器加载Testdll1dalvik.system.PathClassLoader[DexPathList[[zip file"/data/app/], nativeLibrary
本文向大家介绍windows中使用C# 调用 C语言生成的dll,包括了windows中使用C# 调用 C语言生成的dll的使用技巧和注意事项,需要的朋友参考一下 首先建立一个C语言源文件test.c 然后下载mingw64,解压,进入到bin目录,查看是否有gcc.exe ,只要下载正确肯定是有的,可以把这个bin目录加入环境变量,就可以在任意地方运行gcc。偷懒的做法是直接把刚才做好的test
问题内容: 我使用ctypes根据描述DLL函数的参数并返回的描述文件来调用DLL文件中的函数。这是此DLL中称为InitNetwork的一个功能。下面是它的描述: 我在Python中所做的是这样的: 之后,我尝试: 出现错误: 如果我尝试这样做: 我会得到: 为什么会出现这些错误?如何成功调用此函数?任何建议表示赞赏。感谢您的关注! 问题答案: ctypes 官方文档:[Python 3.5]: