c++ - UnsatisfiedLinkError for native cpp function in Android app (ndk) -


i trying run easy android ndk app in cpp, unsatisfiedlink error generate() function.

any appreciated. quite fluent in c++, java little bit rusty. have been trying lot of tips web concerning naming, far no luck. here files:

native.cpp:

#include <string.h> #include <jni.h>  jstring java_com_optimuse_app_optimuseappactivity_generate(jnienv* env, jobject thiz){     return env->newstringutf("hello jni !"); } 

android.mk:

local_path := $(call my-dir)  include $(clear_vars)  local_module    := native local_src_files := native.cpp  include $(build_shared_library) 

i compile ndk-build , goes well, provides me libnative.so, located in project directory. use eclipse rest.

optimuseappactivity.java:

package com.optimuse.app; import android.app.activity; import android.widget.textview; import android.os.bundle;  public class optimuseappactivity extends activity  {     @override     public void oncreate(bundle savedinstancestate)     {         super.oncreate(savedinstancestate);         textview  tv = new textview(this);         tv.settext( generate() );         setcontentview(tv);     }      public native string generate();      static {         system.loadlibrary("native");     } } 

and automatically generated androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.optimuse.app"     android:versioncode="1"     android:versionname="1.0" >      <uses-sdk android:minsdkversion="15" />      <application         android:icon="@drawable/ic_launcher"         android:label="@string/app_name" android:hascode="true">         <activity             android:name="com.optimuse.app.optimuseappactivity"             android:label="@string/app_name" >             <intent-filter>                 <action android:name="android.intent.action.main" />                  <category android:name="android.intent.category.launcher" />             </intent-filter>         </activity>     </application>  </manifest> 

thank suggestions, been searching few hours now!

you running c++ name mangling. example, here objdump -t on library gives when build hello-jni.c:

00000c28 g df .text 0000002c java_com_example_hellojni_hellojni_stringfromjni 

and here's if translate c++ in way did:

00000c94 g df .text 00000024 _z48java_com_example_hellojni_hellojni_stringfromjnip7_jnienvp8_jobject 

to prevent mangling , make them visible jni, declare native functions within extern "c" {} block, ie

#include <string.h> #include <jni.h>  extern "c" {     jstring java_com_optimuse_app_optimuseappactivity_generate(jnienv* env,                                                                 jobject thiz); }  jstring java_com_optimuse_app_optimuseappactivity_generate(jnienv* env,                                                             jobject thiz){     return env->newstringutf("hello jni !"); } 

Comments

Popular posts from this blog

c# - SVN Error : "svnadmin: E205000: Too many arguments" -

c# - Copy ObservableCollection to another ObservableCollection -

All overlapping substrings matching a java regex -