Java-->C++方向:
首先,用native声明接口,这个接口是留给C++来实现的
- package com.hoker;
- public class IVCDll
- {
- static
- {
- System.load( "IVCDll.so" );
- }
- public static native int initDll();
- }
先用javac编译所有的java文件,然后按照package中指定的路径把class文件拷贝过去
javac *.java
mv -f *.class ./com/hoker/
还可能要设置一下库的路径:
export LD_LIBRARY_PATH=./
然后用javah命令(在bin目录下执行)
javah com.hoker.IVCDll -classpath ./
把生成的h文件在C里实现,字符串类型传递:
- jstring jstrRet = NULL;
- jstrRet = (*env)->NewStringUTF(env, (char *)szRet);
然后编译:
gcc -fPIC com_hoker_IVCDLL.c -l自己的库 -o IVCDLL.so -shared
注意:自己的库的名字是libpub.so话,-l参数里只写pub就行了
再写一个java的调用程序:
- package com.hoker;
- public class d
- {
- public static void main(String[] args)
- {
- IVCDLL.initDLL();
- }
- }
java com.hoker.d
C++-->java方向:
我们首先保存一个虚拟机的全局指针(声明为static JavaVM* Manager::m_pJvm[1] = {NULL})
jint r
=
JNI_GetCreatedJavaVMs(
&
Manager::m_pJvm[
0
],
1
,
&
s);
然后在要调用Java的地方(比如另外一个线程),先绑定到当前线程,再调用
JNIEnv
*
env
=
NULL;
(Manager::m_pJvm[ 0 ]) -> AttachCurrentThread(( void ** ) & env, NULL);
jclass System = env -> FindClass( " com/hoker/IVCDll " );
jmethodID getP = env -> GetStaticMethodID( System, " OnEvent " , " ()I " );
env -> CallStaticObjectMethod(System, getP);
(Manager::m_pJvm[ 0 ]) -> AttachCurrentThread(( void ** ) & env, NULL);
jclass System = env -> FindClass( " com/hoker/IVCDll " );
jmethodID getP = env -> GetStaticMethodID( System, " OnEvent " , " ()I " );
env -> CallStaticObjectMethod(System, getP);
GetStaticMethodID的最后一个参数是方法的签名,不知道怎么写的话在cmd里用javap -s 类名来查看一下就知道了