Giter Club home page Giter Club logo

scalacpptest's Introduction

jni本地方法测试

这个演示程序是测试scala和java调用动态库,请用eclipse或者intellij打开,配置好scala环境(不知道请参考项目loaddll(gitee,github));

配置scala环境,请自行百度谷歌。example包下面为scala程序,jexample为java程序,两者调用动态库一样。

注:java测试时请移动至example目录下,scala移动到jexample下(不然两者会有冲突,请分开测试java和scala)

目录结构如下

本项目两个分支

如果满足eclipse或者intellij环境,编译正常,则直接进入步骤2,没有则从步骤1开始

步骤1 编译java和scala字节码

java编译Sample1.java(测试时注意修改包名)

javac example/Sample1.java

scala编译Sample1.scala

scalac example/Sample1.scala

步骤2-生成头文件.h

java生成.h

命令如下

javah -classpath . -jni example.Sample1 
# 必须打包,及命令目录在class文件上一级,不然调用失败 -jni参数可以省略,注意没有class结尾,不然找不到

scala生成.h,前提是配置好scala环境

linux和mac命令如下

SCALA_LIB=$SCALA_HOME/lib
SCALA_CP=$SCALA_LIB/scala-library.jar:$SCALA_LIB/scala-reflect.jar
javah -cp $SCALA_CP:. example.Sample1

windows命令如下

SCALA_LIB=%SCALA_HOME%\lib
SCALA_CP=%SCALA_LIB%\scala-library.jar;$SCALA_LIB\scala-reflect.jar
javah -cp %SCALA_CP%;. example.Sample1
注:windows会多一个.h文件

如下图linux和windows结果 windows和linux的h文件结果比较.png 请忽略example_Sample1_delayedInit__body.h 只需要example_Sample1.h(为了方便重命名Sample1.h) 编写对应的cpp文件Sample1.cpp

步骤3-编译动态库

windows请用vs编译

在目录Sample1下,用vs2103(高版本也行)打开Sample1.sln

linux 编译如下

g++ -dynamiclib -shared -fPIC  \
        -I/usr/include -I$JAVA_HOME/include -I$JAVA_HOME/include/linux \
        Sample1.cpp -o Sample1.so

mac os 编译如下

g++ -dynamiclib -shared -fPIC  \
        -I/usr/include -I$JAVA_HOME/include -I$JAVA_HOME/include/darwin \
        Sample1.cpp -o Sample1.dylib

Cmake方式,文件CMakeLists.txt

linux和mac os下使用cmake

cd Sample1
mkdir build
cd build
cmake ..
make

windows下使用cmake-gui

如图windows-cmake-gui下使用方式.png windows-cmake-gui下使用方式.png

住:目前java和scala两种方式是调用一样的动态库文件,所以觉得复杂时,选用java代码方式编写,获得编译的.h

步骤4 调用

eclipse 调用方式

按照如图配置eclipse配置动态库路径 eclipse配置动态库路径 或者 1.windows环境放进C:\Windows\System32(64位) C:\Windows\SysWOW64(32位) 2.linux放到/usr/lib或者/usr/local/lib 3.苹果暂时未知

命令行调用方式

VM arguments中加入该动态库文件的路径

1.把库放到java命令行执行的当前目录 2.如果不是, 执行命令时添加-Djava.library.path=$(pwd), $(pwd)为放置 Sample1.so(linux) or Sample1.dylib(os x) or Sample1.dll(windows)的目录

java类

java -Djava.library.path=$(pwd) -cp . example.Sample1
scala -Djava.library.path=$(pwd) -cp . example.Sample1

scala类

 SCALA_LIB_HOME=$SCALA_HOME/lib
 SCALA_CP=$SCALA_LIB_HOME/scala-library.jar:$SCALA_LIB_HOME/scala-reflect.jar
 java -Djava.library.path=$(pwd) -cp $SCALA_CP:. example.Sample1

windows下环境变量请替换$符号为%%包裹

另附上开源项目javacpp 以及封装一些预制的开源c++库

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.