将Java双数组传递给Android Studio项目中的C ++

问题描述

我正在用Java开发Android Studio项目,该项目需要C ++才能实现某些信号处理功能。我需要能够将数组类型Double从Java传递给C ++。我尝试过分依赖于这样的示例,例如(Get java array from c++ via JNI),因为MainActivity.java文件已经作为jobject链接到我的native-lib.cpp文件中,我认为这让事情变得太复杂了。有没有更简单的方法来回传递变量? (在下面的非常简单的示例中,我创建了一个名为“ getDouble”的方法来对其进行测试)

C ++代码:

SELECT 
  c.council_name,COUNT(*) AS transaction_count,SUM(amount_tendered) AS revenue
FROM councils c 
JOIN
(
  SELECT council_id,amount_tendered
  FROM market_levy  
  WHERE transaction_date >= CURDATE() 
  UNION ALL
  SELECT s.council_id,st.amount_tendered 
  FROM station_levy st    
  JOIN stations s ON s.station_id = st.station_id
  WHERE st.transaction_datetime >= CURDATE()
) totalCouncilRevenue USING (council_id)
GROUP BY council_id,c.council_name 
ORDER BY SUM(amount_tendered) DESC;

Java代码:

SELECT 
  c.council_name,COALESCE(t1.cnt,0) + COALESCE(t2.cnt,0) AS transaction_count,COALESCE(t1.total,0) + COALESCE(t2.total,0) AS revenue
FROM councils c 
LEFT JOIN
(
  SELECT council_id,SUM(amount_tendered) as total,COUNT(*) as cnt
  FROM market_levy  
  WHERE transaction_date >= CURDATE() 
  GROUP BY council_id
) t1 USING (council_id)
LEFT JOIN
(
  SELECT s.council_id,SUM(st.amount_tendered) as total,COUNT(*) as cnt
  FROM station_levy st    
  JOIN stations s ON s.station_id = st.station_id
  WHERE st.transaction_datetime >= CURDATE()
  GROUP BY s.council_id
) t2 USING (council_id)
ORDER BY revenue DESC;

解决方法

不,您的方法非常正确。但是,该实现有些偏离:

  • 您应该使用MainActivity获得对env->GetObjectClass(obj)类的引用,其中obj是函数的第二个参数。
  • getDouble的签名为()[D。使用javap -s查看正确的签名而不是猜测。

如果数组很大,您可能需要考虑使用GetDoubleArrayRegion来获取double*,您可以直接阅读,或者使用GetDoubleArrayElements / ReleaseDoubleArrayElements进行操作。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...