问题描述
我正在用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
进行操作。