Ilya Berezhnoy
2018-07-20 11:00:36 UTC
Hi everyone,
I try to find out is it possible to create jvm machine to call java code in
native application (c++).
In my project i use gradle and cmake for building.
here is a part of configuration
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.mycomp.vpntuner"
minSdkVersion 24
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
arguments "-DANDROID_STL=c++_shared"
cppFlags "-std=c++14 -fexceptions"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
jniDebuggable true
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
productFlavors {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
and a function to create VM:
JavaVM* javaVM = NULL;
JNIEnv* jEnv = NULL;
JavaVMOption opt[1];
opt[0].optionString = "-Djava.class.path=./";
JavaVMInitArgs args;
args.version = JNI_VERSION_1_6;
args.options = opt;
args.nOptions = 1;
args.ignoreUnrecognized = JNI_FALSE;
void *libdvm_dso = dlopen("libart.so", RTLD_NOW);
if(!libdvm_dso )
{
printf("error to load libart.so library\n");
return 1;
}
void *libandroid_runtime_dso = dlopen("libandroid_runtime.so", RTLD_NOW);
if(!libandroid_runtime_dso)
{
printf("error to load libandroid_runtime.so library\n");
return 1;
}
JNI_CreateJavaVM_t JNI_CreateJavaVM = NULL;
JNI_CreateJavaVM = (JNI_CreateJavaVM_t) dlsym(libdvm_dso, "JNI_CreateJavaVM");
if(!JNI_CreateJavaVM)
{
printf("error: JNI_CreateJavaVM is not found\n");
return 2;
}
printf("JNI_CreateJavaVM is linked!\n");
// registerNatives_t registerNatives;
// registerNatives = (registerNatives_t) dlsym(libandroid_runtime_dso, "Java_com_android_internal_util_WithFramework_registerNatives");
// if(!registerNatives)
// {
// printf("error: registerNatives is not found\n");
// return 3;
// }
// printf("registerNatives is linked!\n");
int rv = JNI_CreateJavaVM(&javaVM, &jEnv, &args);
if (rv < 0)
{
printf("Unable to Launch JVM %d\n", rv);
return 4;
}
printf("jvm is running!\n");
// if(!registerNatives(*p_env, 0))
// {
// printf("error to register natives\n");
// return 5;
// }
// printf("env is reg!\n");
so, the app is fault when JNI_CreateJavaVM is calling with SIGABRT signal.
I will be grateful for any help!
I try to find out is it possible to create jvm machine to call java code in
native application (c++).
In my project i use gradle and cmake for building.
here is a part of configuration
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.mycomp.vpntuner"
minSdkVersion 24
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
arguments "-DANDROID_STL=c++_shared"
cppFlags "-std=c++14 -fexceptions"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
jniDebuggable true
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
productFlavors {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
and a function to create VM:
JavaVM* javaVM = NULL;
JNIEnv* jEnv = NULL;
JavaVMOption opt[1];
opt[0].optionString = "-Djava.class.path=./";
JavaVMInitArgs args;
args.version = JNI_VERSION_1_6;
args.options = opt;
args.nOptions = 1;
args.ignoreUnrecognized = JNI_FALSE;
void *libdvm_dso = dlopen("libart.so", RTLD_NOW);
if(!libdvm_dso )
{
printf("error to load libart.so library\n");
return 1;
}
void *libandroid_runtime_dso = dlopen("libandroid_runtime.so", RTLD_NOW);
if(!libandroid_runtime_dso)
{
printf("error to load libandroid_runtime.so library\n");
return 1;
}
JNI_CreateJavaVM_t JNI_CreateJavaVM = NULL;
JNI_CreateJavaVM = (JNI_CreateJavaVM_t) dlsym(libdvm_dso, "JNI_CreateJavaVM");
if(!JNI_CreateJavaVM)
{
printf("error: JNI_CreateJavaVM is not found\n");
return 2;
}
printf("JNI_CreateJavaVM is linked!\n");
// registerNatives_t registerNatives;
// registerNatives = (registerNatives_t) dlsym(libandroid_runtime_dso, "Java_com_android_internal_util_WithFramework_registerNatives");
// if(!registerNatives)
// {
// printf("error: registerNatives is not found\n");
// return 3;
// }
// printf("registerNatives is linked!\n");
int rv = JNI_CreateJavaVM(&javaVM, &jEnv, &args);
if (rv < 0)
{
printf("Unable to Launch JVM %d\n", rv);
return 4;
}
printf("jvm is running!\n");
// if(!registerNatives(*p_env, 0))
// {
// printf("error to register natives\n");
// return 5;
// }
// printf("env is reg!\n");
so, the app is fault when JNI_CreateJavaVM is calling with SIGABRT signal.
I will be grateful for any help!
--
You received this message because you are subscribed to the Google Groups "android-ndk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to android-ndk+***@googlegroups.com.
To post to this group, send email to android-***@googlegroups.com.
Visit this group at https://groups.google.com/group/android-ndk.
To view this discussion on the web visit https://groups.google.com/d/msgid/android-ndk/8f183b2f-712b-47b3-892b-ed721aa44d54%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to the Google Groups "android-ndk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to android-ndk+***@googlegroups.com.
To post to this group, send email to android-***@googlegroups.com.
Visit this group at https://groups.google.com/group/android-ndk.
To view this discussion on the web visit https://groups.google.com/d/msgid/android-ndk/8f183b2f-712b-47b3-892b-ed721aa44d54%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.