假设一个包含类的Java库,让我们调用它Foo.该类包含一个构造函数和两个方法:
// constructor
Foo();
// returns a random int
public int bar();
// generates a random int "x" and calls integerGenerated(x)
public void generateInt(IntGeneratorListenerInterface listenerInterface);
Run Code Online (Sandbox Code Playgroud)
这假定Java接口IntGeneratorListenerInterface有一个方法:
void integerGenerated(int generatedInt);
Run Code Online (Sandbox Code Playgroud)
我可以bar()从本机C和C++ 调用.这是一个C++示例,假设已正确初始化JNIEnv env:
// instantiate Foo
jclass fooClass = env->FindClass("com/my/package/Foo");
jmethodID constructorMethodID = env->GetMethodID(fooClass, "<init>", "()V");
jobject fooInstance = env->NewObject(fooClass, constructorMethodID);
// call bar()
jmethodID barMethodID = env->GetMethodID(fooClass, "bar", "()I");
jint result = env->CallIntMethod(fooInstance, barMethodID);
printf("%d", result);
Run Code Online (Sandbox Code Playgroud)
我想要做的是IntGeneratorInterface从C/C++ 实现接口,这样当我generateInt()使用类似的JNI调用调用时,我可以在C中接收回调,如: …
我目前正在使用类似于以下内容的VBA代码来指定共享库的位置,以用于从Office应用程序到桌面应用程序的通信(传递字符串).VBA代码/宏需要存在于加载项(.ppa)中.
Private Declare Sub sharedLibPassString CDecl Lib "/Users/myUserName/Library/Application Support/myCompanyName/MySharedLib.dylib" Alias "PassString" (ByVal aString As String)
Run Code Online (Sandbox Code Playgroud)
在VBA宏代码中,我可以执行以下操作.
Call sharedLibPassString(myString)
Run Code Online (Sandbox Code Playgroud)
我有通信工作,但我想/Users/myUserName/用当前用户的主目录替换该部分.通常在Mac上,您指定~/Library/Application Support/...,但~/语法不起作用,产生"文件未找到"运行时错误.
我发现使用以下环境变量方法可以获得我~/需要的位置:
Environ("HOME")
Run Code Online (Sandbox Code Playgroud)
但是,我没有看到制作CDecl Lib声明这一部分的方法,因为据我所知,它Environ是在运行时进行评估的.
有没有办法~/在VBA 中的用户主目录()中指定共享库的位置?
以下是关于我的环境/方法的一些注意事项: