Skip to content

Commit 31c3102

Browse files
committed
CppCallJni
1 parent a1698d9 commit 31c3102

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed

CMakeLists.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
cmake_minimum_required(VERSION 3.4.1)
2+
# close openssl
3+
4+
project(CppCallJni)
5+
6+
add_subdirectory(callc)
7+
8+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDYZ_DBG")
9+
set(JAVA_HOME "$ENV{JAVA_HOME}")
10+
file(GLOB C_LIBRARY_SRC callc/*.cpp callc/*.h)
11+
file(GLOB CPP_CALL_JNI_SRC *.cpp *.h)
12+
MESSAGE(STATUS "JAVA_HOME DIR: ${JAVA_HOME} ENV_JAVA_HOME DIR: $ENV{HOME}")
13+
14+
include_directories(CppCallJni ${CMAKE_CURRENT_SOURCE_DIR}/ ${CMAKE_CURRENT_SOURCE_DIR}/callc ${JAVA_HOME}/include/ ${JAVA_HOME}/include/win32)
15+
link_directories(CppCallJni ${CMAKE_CURRENT_SOURCE_DIR}/callc ${JAVA_HOME}/lib/)
16+
add_executable(CppCallJni ${C_LIBRARY_SRC} ${CPP_CALL_JNI_SRC})
17+
target_link_libraries(CppCallJni jvm)

CppCallJni.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "com_durongze_jni_CallC.h"
2+
#include <Windows.h>
3+
4+
#define JAVA_HOME "D:\\Program Files\\Java\\jre1.8.0_60"
5+
6+
#define JVM_DLL JAVA_HOME "\\bin\\server\\" "jvm.dll"
7+
typedef int (*JNICreateJavaVM)(JavaVM **pvm, void **penv, void *args);
8+
int main() {
9+
JavaVM *pvm = NULL;
10+
JNIEnv *penv = NULL;
11+
JavaVMInitArgs args;
12+
JavaVMOption options[1] = {"-Djava.class.path=.;D:\\Program Files\\Java\\jre1.8.0_60\\lib\\dt.jar;D:\\Program Files\\Java\\jre1.8.0_60\\lib\\tools.jar"};
13+
args.options = options;
14+
args.nOptions = 1;
15+
args.version = JNI_VERSION_1_6;
16+
args.ignoreUnrecognized = JNI_TRUE;
17+
char *jvmDll = JVM_DLL;
18+
HMODULE hmod = LoadLibraryA("D:\\Program Files\\Java\\jre1.8.0_60\\bin\\server\\jvm.dll");
19+
JNICreateJavaVM pJNICreateJavaVM = (JNICreateJavaVM)GetProcAddress(hmod, "JNI_CreateJavaVM");
20+
int status = pJNICreateJavaVM(&pvm, (void**)&penv, (void**)&args);
21+
if (status == JNI_ERR) {
22+
return 0;
23+
}
24+
int num = 2;
25+
jclass intArrCls = penv->FindClass("java/lang/String");
26+
jobjectArray names = penv->NewObjectArray(num, intArrCls, NULL);
27+
jintArray ages = penv->NewIntArray(num);
28+
jfloatArray heights = penv->NewFloatArray(num);
29+
30+
for (int idx = 0; idx < num; ++idx) {
31+
const char *pns = "xxx";
32+
jstring ns = penv->NewStringUTF(pns);
33+
jint intArr[1] = { idx };
34+
jfloat floatArr[1] = { idx };
35+
penv->SetIntArrayRegion(ages, idx, 1, intArr);
36+
penv->SetFloatArrayRegion(heights, idx, 1, floatArr);
37+
penv->SetObjectArrayElement(names, idx, ns);
38+
penv->ReleaseStringUTFChars(ns, 0);
39+
}
40+
41+
jobjectArray res = (jobjectArray)Java_com_durongze_jni_CallC_CInterface(penv, NULL, names, ages, heights, num);
42+
43+
pvm->DestroyJavaVM();
44+
}

build.bat

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
set JAVA_HOME=D:\Program Files\Java\jdk1.8.0_60
2+
set PATH=%PATH%;%JAVA_HOME%\bin;E:\Android\sdk\ndk-bundle\android-ndk-r20
3+
4+
rem ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk
5+
6+
mkdir dyzbuild
7+
pushd dyzbuild
8+
cmake -G "Visual Studio 14 2015 Win64" ..
9+
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat"
10+
msbuild CppCallJni.vcxproj
11+
popd

0 commit comments

Comments
 (0)