我有一个C++ DLL,其中包含我需要在Java程序中使用的方法.我已经阅读了关于JNI的所有Sun文档,以及我在网上找到的大量教程,我似乎无法找到我的代码的问题.事实上,相当一部分代码是从各种教程和Sun网站剪切和粘贴的.
我的具体问题如下:我的C++本机方法从我的Java程序接收jdoubleArray,需要将其映射到c ++向量,然后可以将其传递给C++ dll中的方法.dll中的方法返回另一个向量,然后需要将其映射到新的jdoubleArray,并返回到Java程序.问题似乎是我没有正确执行映射.
我的代码如下(为简单起见,我删除了对dll方法的调用):
JNIEXPORT jdoubleArray JNICALL Java_jniarraypassing_JNIArrayPassing_passAndReturn(JNIEnv *env, jclass jcls, jdoubleArray arr)
{
//First get a pointer to the elements within the jdoubleArray
jsize len = env->GetArrayLength(arr);
jboolean isCopy1;
jdouble *body = env->GetDoubleArrayElements(arr, &isCopy1);
//Create the vector<double> and reserve enough memory for mapping
std::vector<double> newvector;
newvector.reserve(len);
//Copy the contents of the jdoubleArray to the vector<double>
for (int i=0; i<len; i++)
{
newvector.push_back(body[i]);
}
//Release the pointer to the jdoubleArray
if (isCopy1 == JNI_TRUE)
{
env->ReleaseDoubleArrayElements(arr, body, JNI_ABORT); …Run Code Online (Sandbox Code Playgroud) 我正在使用 Java 本机接口访问我在 C++ 中创建的 DLL 中的几个本机方法。我可以毫无问题地加载库,但我只能调用位于 Java 应用程序主类中的方法。换句话说,只要我声明方法并将 loadLibrary 命令放在主类中,一切都可以完美运行。
但是,如果我尝试放置 loadLibrary 命令,并在单独的类中声明本机方法,则会出现以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: sdr_api.SDR_API_Interface.SetDebugFlag_Native(Z)V
at sdr_api.SDR_API_Interface.SetDebugFlag_Native(Native Method)
at sdr_api.SDR_API_Interface.SetDebugFlag(SDR_API_Interface.java:74)
at sdr_api.SDR_API.main(SDR_API.java:183)
Run Code Online (Sandbox Code Playgroud)
我尝试查看 JNI 文档以检查是否要求必须在主类中声明所有本机方法,但我找不到任何内容。我想将这些方法移到一个单独的类中,因为我需要在单独的线程中使用它们(我只需要该类的一个实例,因此可以在必要时将它们声明为静态)。
我最好的猜测是在特定类中声明方法会以某种方式改变它们在 DLL 中的调用方式,但我不知道如何。
任何帮助将不胜感激!
编辑:添加了相关的代码示例
SDR_API 类:
package sdr_api;
public class SDR_API
{
public static void main(String[] args)
{
try
{
double Rate = 2e5;
double TxRxFreq = 5e9;
double RxGain = 0;
double TxGain = 0;
SDR_API_Interface mySDRAPI = new SDR_API_Interface();
mySDRAPI.SetDebugFlag(true);
mySDRAPI.Setup_BS_Config("addr=192.168.10.2",Rate,Rate,TxRxFreq,TxRxFreq,RxGain,TxGain);
mySDRAPI.Setup_MT_Config("addr=192.168.20.2",Rate,Rate,TxRxFreq,TxRxFreq,RxGain,TxGain);
}
catch(Exception e)
{
System.err.println("Exception …Run Code Online (Sandbox Code Playgroud) 我有两个arraylists,一个包含字符串,另一个包含具有String数据成员的类.目标是通过第二个arraylist中的对象进行递归,并找到哪个对象的字符串数据成员等于第一个arraylist中的字符串值.
现在我明白你不能使用==运算符来比较字符串,所以我最初使用了equals方法,现在我已经尝试了contentEquals方法,但无论我选择哪种方法,字符串总是被归类为相等 - 即使他们不是.因此,每当我运行下面的代码时,无论字符串是否实际相等,"if"语句在第一次调用时总是返回true.
Iterator stringListIter = stringList.iterator();
Iterator objectListIter = objectList.iterator();
while (stringListIter.hasNext())
{
String currentString = (String) stringListIter.next();
while (objectListIter.hasNext())
{
MyObject currentObject = (MyObject) objectListIter.next();
String objectString = currentObject.getString();
if (objectString.contentEquals(currentString));
{
//Do something here.....
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.我觉得它可能是相当简单的东西,但我只是看不到它.