Commit c00546ed authored by captainwong's avatar captainwong

tools

parent 163c79b6
现在已经支持 `Java` 通过 `JNI` 调用 `C++` 的动态链接库。
## 总体流程
1. 根据 `javademo/jni/AdemcoHbLibrary.java` 生成 `C++` 头文件 `javademo/cpp/javademo_jni_AdemcoHbLibrary.h`, `javademo/cpp/javademo_jni_AdemcoHbLibrary_ParseResult.h`
2. 编译 `javademo/cpp` 项目生成动态库供 `Java` 项目调用
3. `Java` 项目引入 `javademo/jni/AdemcoHbLibrary.java`
可以参考 `SimpleServer` 引入 `AdmeocHbLibrary` 进行解包、打包。
注意若使用预编译动态库,引入 `AdmeocHbLibrary` 时需整包引入,动态链接库会以包名查找 `AdmeocHbLibrary` 类,详情见 [dllmain.cpp](javademo/cpp/dllmain.cpp)`Java_javademo_jni_AdemcoHbLibrary_nativeParse` 函数,包名不同则查找失败,用户自行编译动态库时需同时修改此函数内容。
## Unix-based
已经在以下环境测试成功:
* `Ubuntu16.04` + `java-8-openjdk-amd64`
* `Centos 7` + `java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64`
* `macOS Catalina` + `jdk-9.0.1`
用户环境可以自行修改 `javademo.sh`
执行 `./javademo.sh`
## Windows
1. `javac -encoding utf-8 ./javademo/jni/AdemcoHbLibrary.java && javah -d ./javademo/cpp -jni javademo.jni.AdemcoHbLibrary`
2. 使用 `Visual Studio 2019` 打开 `examples.sln`, 以 `Release/x64` 编译 `ademco_java` 项目,可能需要修改项目属性 `C/C++` --> `Additional Include Directories`,将与 `Java` 相关的路径修改,生成 `x64/Release/ademco_java.dll`
3. `javac -encoding utf-8 javademo/jni/SimpleServer.java` 编译示例
4. `java javademo.jni.SimpleServer 12345` 进行测试
## 作者对 `Java` 开发不熟悉,有任何意见、建议欢迎提 `issue` 及 `pr`
#!/bin/bash
mkdir -p build
JAVADEMO_SRC='./javademo/cpp'
# Ubuntu 16.04
JAVA_INCLUDE='/usr/lib/jvm/java-8-openjdk-amd64/include'
# Centos 7
#JAVA_INCLUDE='/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/include'
# macOS Catalina
#JAVA_INCLUDE='/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/include'
# Ubuntu & Centos
JAVA_INCLUDE_OS=$JAVA_INCLUDE/linux
# macOS
#JAVA_INCLUDE_OS=$JAVA_INCLUDE/darwin
rm -f javademo/jin/*.class
# 编译Java类
javac -encoding utf-8 javademo/jni/AdemcoHbLibrary.java
# 生成C++头文件
javah -d javademo/cpp -jni javademo.jni.AdemcoHbLibrary
# 生成C++动态库,目标文件 ./build/libademcojava.so
g++ -std=c++11 $JAVADEMO_SRC/pch.cpp $JAVADEMO_SRC/dllmain.cpp -I$JAVADEMO_SRC -I../include -I$JAVA_INCLUDE -I$JAVA_INCLUDE_OS -fPIC -shared -o build/libademcojava.so
# 编译使用动态库的Java示例
javac -encoding utf-8 javademo/jni/SimpleServer.java
# 执行使用动态库的Java示例
java javademo.jni.SimpleServer 12345
......@@ -75,6 +75,12 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<TargetName>$(ProjectName)_x64</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<TargetName>$(ProjectName)_x64</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
......
# Tools 测试及演示工具,已编译的dll等
* `server_demo.exe` 简易版接警中心,可用来接收主机报告、远程控制
## 直连型主机模拟器
*说明:本程序仅用来模拟测试,如果有与真实主机不一致的情况,以真实主机为准。*
注意:界面左侧修改主机配置后需要点击左上角菜单 文件--保存 后才能被程序读取生效。
\ No newline at end of file
......@@ -4,5 +4,6 @@ rm -rf linux_java
rm -rf mac_java
rm -rf win_csharp
rm -rf win_java
rm -rf server_demo
cd ../swig
rm -rf *.exp *.lib *.dll *.exe *.obj *.class com/
.exp
.iobj
.ipdb
.lib
.pdb
\ No newline at end of file
......@@ -7,5 +7,7 @@ cp ../../swig/*.cs .
cp ../../swig/*.so .
cd ..
rm -f linux_java.zip
zip linux_java.zip linux_java
cd linux_java
zip -r ../linux_java.zip . *
cd ..
rm -rf linux_java/
......@@ -8,5 +8,7 @@ cp ../../swig/*.cs .
cp ../../swig/*.dylib .
cd ..
rm -f mac_java.zip
zip mac_java.zip mac_java/
cd mac_java
zip -r ../mac_java.zip . *
cd ..
rm -rf mac_java/
#!/bin/bash
# server-demo
# ./clean.sh
# ./server_demo.bat
# ./server_demo_x64.bat
# cp ../examples/Win32/Release/server_demo.exe .
# cp ../examples/x64/Release/server_demo_x64.exe .
# rm -f server_demo.zip
# zip server_demo.zip server_demo.exe server_demo_x64.exe
# rm -f server_demo.exe server_demo_x64.exe
# win-java
./clean.sh
./win_java.bat
mkdir -p win_java
cd win_java
cp -r ../../swig/com/ .
cp ../../swig/*.java .
cp ../../swig/*.dll .
cd ..
rm -f win_java.zip
zip win_java.zip win_java
rm -rf win_java
# ./clean.sh
# ./win_java.bat
# mkdir -p win_java
# cp -r ../swig/com/ win_java/
# rm -f win_java/com/hb3344/ademco/*.class
# cp ../swig/*.java win_java/
# cp ../swig/*.dll win_java/
# rm -f win_java.zip
# cd win_java
# zip -r ../win_java.zip . *
# cd ..
# rm -rf win_java
# win-c#
./clean.sh
./win_csharp.bat
mkdir -p win_csharp
cd win_csharp
cp -r ../../swig/com/ .
cp ../../swig/*.cs .
cp ../../swig/*.dll .
cp ../../swig/*.exe .
cd ..
rm -f win_csharp.zip
zip win_csharp.zip win_csharp
rm -rf win_csharp
# ./clean.sh
# ./win_csharp.bat
# mkdir -p win_csharp
# cp -r ../swig/com/ win_csharp/
# cp ../swig/*.cs win_csharp/
# cp ../swig/*.dll win_csharp/
# cp ../swig/*.exe win_csharp/
# rm -f win_csharp.zip
# cd win_csharp
# zip -r ../win_csharp.zip . *
# cd ..
# rm -rf win_csharp
# ubuntu20.04 java
ssh -t root@192.168.2.107 "cd /root/projects/ademco_hb && git reset --hard HEAD && git pull origin c && cd swig && export JAVA_HOME='/usr/lib/jvm/java-8-openjdk-amd64' && ./linux_java.sh && cd ../tools && ./linux_java.sh"
scp root@192.168.2.107:/root/projects/ademco_hb/tools/linux_java.zip .
ssh -t root@192.168.2.107 "rm -f /root/projects/ademco_hb/tools/linux_java.zip"
exit
# macOS java
ssh -t jack@wangjackdeMacBook-Pro "cd /Users/jack/projects/ademco_hb && git reset --hard HEAD && git pull origin c && cd swig && source ~/.zshrc && export JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home' && ./mac_java.sh && cd ../tools && ./mac_java.sh"
scp jack@wangjackdeMacBook-Pro:/Users/jack/projects/ademco_hb/tools/mac_java.zip .
......
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat"
devenv /Build "Release|x86" ../examples/examples.sln /project server_demo
\ No newline at end of file
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
devenv /Build "Release|x64" ../examples/examples.sln /project server_demo
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment