java在Windows Android Studio中获取错误消息“error:(16)未定义对'JNI_CreateJavaVM'的引用”
我试图使用C文件在Java类中调用define方法。我用JNI来做这个。我是李女士。调用java类中的方法的C文件:
#include <stdio.h>
#include<jni.h>
JNIEnv* create_vm(JavaVM **jvm)
{
JNIEnv* env;
JavaVMInitArgs args;
JavaVMOption options;
args.version = JNI_VERSION_1_6;
args.nOptions = 1;
options.optionString = "-Djava.class.path=./";
args.options = &options;
args.ignoreUnrecognized = 0;
int rv;
rv = JNI_CreateJavaVM(&jvm, (void**)&env, &args);
if (rv < 0 || !env)
printf("Unable to Launch JVM %d\n",rv);
else
printf("Launched JVM! :)\n");
return env;
}
void invoke_class(JNIEnv* env)
{
jclass hello_world_class;
jmethodID square_method;
jint number=20;
hello_world_class = (*env)->FindClass(env, "MainActivity");
square_method = (*env)->GetStaticMethodID(env, hello_world_class, "square", "(I)I");
printf("%d squared is %d\n", number,
(*env)->CallStaticIntMethod(env, hello_world_class, square_method, number));
}
int main(int argc, char **argv)
{
JavaVM *jvm;
JNIEnv *env;
env = create_vm(&jvm);
if(env == NULL)
return 1;
invoke_class(env);
return 0;
}
当我尝试构建项目时,它总是让我出错
C:\Projects\AndroidProjects\NDKSample\app\src\main\jni\test.c Error:(16) undefined reference to 'JNI_CreateJavaVM' Error:error: ld returned 1 exit status make.exe: *** [C:/Projects/AndroidProjects/NDKSample/app/src/main/obj/local/armeabi/libMyLib.so] Error 1 make.exe: Leaving directory `C:/Projects/AndroidProjects/NDKSample/app/src/main/jni' :app:ndkBuild FAILED Error:Execution failed for task ':app:ndkBuild'.
Process 'command 'C:\Users\mmjoshi\AppData\Local\Android\ndk\ndk-build.cmd'' finished with non-zero exit value 2
请让我知道,我如何解决这个错误请注意,我正在Windows 7的Android Studio中尝试此功能
以下是我的Graddle文件,仅供参考:
import org.apache.tools.ant.taskdefs.condition.Os
apply plugin: 'com.安卓.application'
安卓 {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "einfo.ndksample"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
ndk {
moduleName "MyLib"
}
}
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = [] //disable automatic ndk-build call
}
project.ext.versionCodes = ['armeabi':1, 'armeabi-v7a':2, 'arm64-v8a':3, 'mips':5, 'mips64':6, 'x86':8, 'x86_64':9] //versionCode digit for each supported ABI, with 64bit>32bit and x86>armeabi-*
安卓.applicationVariants.all { variant ->
// assign different version code for each output
variant.outputs.each { output ->
output.versionCodeOverride =
project.ext.versionCodes.get(output.getFilter(com.安卓.build.OutputFile.ABI), 0) * 1000000 + defaultConfig.versionCode
}
}
task ndkBuild(type: Exec) {
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
def ndkDir = 安卓.ndkDirectory.getAbsolutePath()
commandLine ndkDir + '\\' + 'ndk-build.cmd', '-C', file('src/main/jni').absolutePath
} else {
commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
}
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-安卓.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.安卓.support:appcompat-v7:22.2.0'
}
提前谢谢
# 1 楼答案
在Android上,您无法从C创建Java虚拟机。但没有必要这样做:您的应用程序已经在JVM中运行,您的本机代码不需要
int main()
入口点。相反,它被编译到一个共享库(类似于Android的DLL)中,并从Java加载(通常从具有本机方法的类的静态构造函数加载)Android确实支持从C到Java的调用(通过FindClass和CallStaticMethod及其kin),但
JNIEnv* env
是在Java调用中接收的,而不是在C中创建的