java调用C++注意事项

https://www.cnblogs.com/xiaocainiao2hao/p/5619862.html
https://blog.csdn.net/zhangshiting/article/details/53468158
注意:javah命令是在***src***目录下运行的。
eg:D:\Code\java\DSPNGraph\src>javah -classpath . -jni pipe.hla.SimDSPNModule.test.jni.MetisC2JTest
这里可能出错===》如果注释是中文的话
生成.h文件的时候,跳到包名文件夹的上一级就好,类的名字是指包名.类型,不要在cmd中进入包内。
https://blog.csdn.net/l1028386804/article/details/46604963
得拷贝进文件夹,不能在VS操作
使用“” ,不使用<>
https://blog.csdn.net/javaniuniu/article/details/68923206
③必须设置好DLL搜索路径,或者将dll拷贝到C:\WINDOWS\system32下面。

java 和C++所在的软件32为或者64位什么的都必须得一样。
https://blog.csdn.net/woainishifu/article/details/54017550
https://www.cnblogs.com/qingyuanjushi/p/5722884.html
手动引入jni.h及jni_md.h两个头文件,在JDK下的include文件中

之后调用JNI的时候需要注意的是:
(1)数组jintArray和jint
(2)声明一个数组返回:

jint *buf = new jint[partLen];
	for (int i = 0; i < partLen;i++){
		buf[i] = partp[i];
		
	}
	//从partp返回值创建一个新的数组返回
	part = env->NewIntArray(partLen);
	env->SetIntArrayRegion(part,0,partLen,buf);

(3)别忘了参数

JNIEXPORT jint JNICALL Java_pipe_hla_SimDSPNModule_test_jni_MetisC2JTest_DLL_1ADD
(JNIEnv *env, jobject object, jint a, jint b){
	int var = 0;
	var = DLL_API_ADD(a,b);
}

(4)可以获得数组中的元素和数组的长度

jint *carr = env->GetIntArrayElements(xadj, false);
	int xadjLen = env->GetArrayLength(xadj);

https://blog.csdn.net/lijianhy/article/details/31361011
https://blog.csdn.net/likuan0214/article/details/52671840
https://www.cnblogs.com/ezhong/archive/2011/11/22/2259403.html
https://blog.csdn.net/wangkr111/article/details/7883469
http://blog.sina.com.cn/s/blog_5de73d0b0102xqo8.html
https://www.cnblogs.com/lijunamneg/archive/2012/12/22/2828922.html
https://blog.csdn.net/Mislead/article/details/51836844

(5)进行调用的时候出现了错误,前面的内容如下:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff8b70e3077, pid=54764, tid=0x000000000000c894

#
# JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [ntdll.dll+0x13077]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

后面还有一些线程和进程相关的内容,从里面可以看出eden、from、to还有老年区的内存使用情况等等。

一直在纠结,尚未克服==》参考的网址如下,供以后回顾:
https://stackoverflow.com/questions/21221942/the-crash-happened-outside-the-java-virtual-machine-in-native-code-error-while-e 这个和我的不太一样
https://www.cnblogs.com/shiyangxt/archive/2009/01/06/1370627.html 这个讲解很清楚,从中学习了不少东西。
https://blog.csdn.net/diyucity/article/details/64122473?utm_source=blogxgwz2http://seanhe.iteye.com/blog/905997 这个是编译优化方面的问题,也不太一样
https://blog.csdn.net/raintungli/article/details/7642575 简单的讲解下
https://stackoverflow.com/questions/9231053/the-crash-happened-outside-the-java-virtual-machine-in-native-code-how-to-sol 这个很像,它是调用的时候传参错误,我可能也会这样。

====>已经解决!是因为C++函数中数组声明的时候,写了一个常数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值