2016-08-19 77 views
0

我使用的是Android 2.1.2工作室我不使用实验插件Android Studio中JNI与C++ UnsatisfiedLinkError

请检查下列文件,并检查我得到的错误。

我解决了这个问题。编辑的文件如下。他们的方式我修正它可能不是正确的方式,因为我设置属性使用不推荐的方式,但它的工作原理。实验性插件仍然可能不稳定。我将很快试用实验性插件。

从模块

sourceSets.main { 
     jniLibs.srcDir 'src/main/libs' 
     /*jni.srcDirs = [] not using this, I commented this. Please check SO links which explained when to use this and when not to use this*/ 
    } 

以下4个文件的build.gradle是在主

JNI夹Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := mylib 
LOCAL_SRC_FILES := HelloJni.cpp 

include $(BUILD_SHARED_LIBRARY) 

Application.mk

APP_ABI := all 

HelloJni .cpp

#include <jni.h> 
#include <Header.h> 

JNIEXPORT jstring JNICALL Java_com_example_m1035325_ndksampleapp_MainActivity_getStringFromJni(JNIEnv *env,jobject thiz) 
{ 
env-> NewStringUTF ("Hellofrom JNI!"); 
} 

Header.h

#include <jni.h>; 
using namespace std; 

#ifndef HEADER 
#define HEADER 

extern "C" { 
JNIEXPORT jstring JNICALL Java_com_example_m1035325_ndksampleapp_MainActivity_getStringFromJni(JNIEnv *env, jobject obj); 
} 

#endif //NDKSAMPLEAPP_HEADER_H 

MainActicity.java

static 
    { 
     System.loadLibrary("mylib"); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     TextView tvHello=(TextView)findViewById(R.id.tvHello); 
     tvHello.setText(getStringFromJni()); 
    } 

    public native String getStringFromJni(); 

在这里,当我在法悬停getStringFromJni它显示无法解析对应的JNI功能

我已经设置项目结构和路径环境变量中的NDK路径。

我收到以下错误

Process: com.example.m1035325.ndksampleapp, PID: 12831 
                        java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.example.m1035325.ndksampleapp.MainActivity.getStringFromJni() (tried Java_com_example_m1035325_ndksampleapp_MainActivity_getStringFromJni and Java_com_example_m1035325_ndksampleapp_MainActivity_getStringFromJni__) 
                         at com.example.m1035325.ndksampleapp.MainActivity.getStringFromJni(Native Method) 

我搜索了很多也是如此,但我没有得到什么,我错过了什么?

现在没有错误,上面的错误是固定的。请检查我对这个问题的回答。

+0

您缺少'JNICALL',签名应该以'JNIEXPORT jstring JNICALL'开头, – marcinj

+0

感谢您的输入。是的,你是对的。我将其添加到我的文件中。请检查我上面编辑的文件。 – AdiAtAnd

回答

0

一个我做出了重要的变化是在文件gradle.properties,如下所示

android.useDeprecatedNdk =真

所以其相关到Android Studio版本2.1.2,对于此版本,实验性插件是使用的默认选项,我正在使用的方法已弃用。 我将很快试用插件。

1

我认为这个问题是在你的Android.mk文件:

LOCAL_SOURCE_FILE := HelloJni.cpp 

AFAIK Android编译系统不使用该名称的变量。它应该是:

LOCAL_SRC_FILES := HelloJni.cpp 
+0

感谢您的输入。我做了这个改变,现在在ndk构建我的cpp文件正在编译。然后,我修复了我的CPP文件中的一些错误,例如NewStringUTF函数调用等,做了ndk-build .so生成但仍然在运行的应用程序,我得到相同的“ UnsatisfiedLinkError”。有一件事是在我的MainActivity类中,当我将鼠标悬停在本地方法上时,它显示我无法解析相应的JNI函数。你能帮我解决这个问题吗? – AdiAtAnd

+0

我是否缺少MainActivity.java中的任何导入.. Android UI文件? – AdiAtAnd