zoukankan      html  css  js  c++  java
  • Jni的一个异常

      UnsatisfiedLinkError:No implementation found for java.lang.String com.skymaster.hs.test4.MainActivity.getstringFromJNI();

    就是桌这个路径下的方法stringFromJNI();没有被实现,看看全部代码

    public class MainActivity extends AppCompatActivity {
    
        // Used to load the 'native-lib' library on application startup.
        static {
            System.loadLibrary("native-lib");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Example of a call to a native method
            TextView tv = (TextView) findViewById(R.id.sample_text);
            tv.setText(stringFromJNI());
            tv.append(getStringFromJNI());
        }
    
        /**
         * A native method that is implemented by the 'native-lib' native library,
         * which is packaged with this application.
         */
        public native String stringFromJNI();
        public native String getStringFromJNI();
    }

    下面是cpp目录中native-lib.cpp的代码

    #include <jni.h>
    #include <string>
    using namespace std;
    extern "C"
    
        jstring
        Java_com_skymaster_hs_test4_MainActivity_stringFromJNI(
                JNIEnv *env,
                jobject /* this */) {
            std::string hello = "Hello from C++";
            return env->NewStringUTF(hello.c_str());
        }
    
        jstring
        Java_com_skymaster_hs_test4_MainActivity_getStringFromJNI(
                JNIEnv *env,
                jobject /* this */) {
            string hello = "    Hello Android";
            return env->NewStringUTF(hello.c_str());
        }

    这里虽然是c++的源文件,但是两个函数都是c的函数,所以需要用extern "C"(大写的C)来告诉c++编译器需要按照c的的方式来编译与链接。问题出在
    extern "C"的作用范围,如果不用大括号包括2个函数就会出问题。修改如下就好了

    #include <jni.h>
    #include <string>
    using namespace std;
    extern "C" {
    
        jstring
        Java_com_skymaster_hs_test4_MainActivity_stringFromJNI(
                JNIEnv *env,
                jobject /* this */) {
            std::string hello = "Hello from C++";
            return env->NewStringUTF(hello.c_str());
        }
    
        jstring
        Java_com_skymaster_hs_test4_MainActivity_getStringFromJNI(
                JNIEnv *env,
                jobject /* this */) {
            string hello = "    Hello Android";
            return env->NewStringUTF(hello.c_str());
        }
    }
    这个只不过是自己的流水账,偶尔有一些心得,错误的地方概不负责
  • 相关阅读:
    Python3学习笔记22-文件读写
    Python3学习笔记21-实例属性和类属性
    Python3学习笔记20-获取对象信息
    Python3学习笔记19-继承和多态
    Python3学习笔记18-访问限制
    Python3学习笔记17-类与实例
    Python3学习笔记16-错误和异常
    Python3学习笔记15-迭代器与生成器
    Python3学习笔记14-迭代与列表生成式
    Python3学习笔记13-函数的参数
  • 原文地址:https://www.cnblogs.com/ashitaka/p/5947026.html
Copyright © 2011-2022 走看看